0

我有一个user模型,我正在尝试创建一个管理创建/更新表单渲染/发布的视图。

这是我现在所做的视图

def user_edit(request, user_id=None):
    obj = {}
    status = 200

    if user_id:
        user = get_object_or_404(User, pk=user_id)
    else:
        user = User()

    user_form = UserForm(instance=user, prefix='user')

    if request.method == 'POST':
        user_form = UserForm(request.POST, instance=user, prefix='user')
        if user_form.is_valid():
            user_form.save()
        else:
            status = 406

    obj['user_form'] = user_form
    return render(request, 'user/edit.html', obj, status=status)

这工作正常,但如您所见,我user_form被初始化了 2 次。为了使这更干燥,POST有时我想更新表单定义而不是重新定义它。就像是:

    if request.method == 'POST':
        user_form.data = request.POST
        user_form.prefix = 'user'

但我无法完成这项工作。所以2个问题:

  • 我的观点似乎有效吗?
  • 如何避免表单重新定义?
4

2 回答 2

3

我会以这种方式重组几行:

def user_edit(request, user_id=None):

    status = 200

    if user_id:
        user = get_object_or_404(User, pk=user_id)
    else:
        user = User()

    user_form = UserForm(request.POST or None, instance=user, prefix='user')

    if request.method == 'POST':
        if user_form.is_valid():
            user_form.save()
        else:
            status = 406

    return render(request, 'user/edit.html', {'form': user_form}, status=status)

有时,复制 1 行代码以保持可读性是有意义的。

于 2013-06-08T13:50:10.310 回答
0

你应该使用这样的 if 条件来初始化表单一次:

def contact(request):
    if request.method == 'POST': # If the form has been submitted...
        form = ContactForm(request.POST) # A form bound to the POST data
        if form.is_valid(): # All validation rules pass
            # Process the data in form.cleaned_data
            # ...
            return HttpResponseRedirect('/thanks/') # Redirect after POST
    else:
        form = ContactForm() # An unbound form

    return render(request, 'contact.html', {
        'form': form,
    })

取自django 的文档。如果您是 Python 新手,在语句中定义变量可能看起来很奇怪if..else,但在 Python 中这是非常常见且有效的方式。

于 2013-06-08T13:32:34.640 回答