在Django中使用相同的表单添加新记录和编辑现有记录,并添加URL参数。

问题描述 投票:0回答:1

我想在数据库中添加新记录和编辑现有记录时使用相同的表单。要编辑的记录的id是通过URL传递的(我应该这样做吗?)。

urlpatterns = [
    path('add-or-edit/<int:id>/', add-or-edit_view, name='edit'),
    path('add-or-edit/', add-or-edit_view, name='create'),
[...]

views.py:

def add-or-edit_view(request, id):
    if id is not there: # pseudocode, of course :)
        form = MyForm(request.POST or None)

    elif request.method == "POST":
        obj = get_object_or_404(Event, id=id)
        form = MyForm(request.POST or None, instance=obj)

        if form.is_valid():

            form.save()

    context = {
                'form':form
                }

    return render(request, "templates/add-or-edit.html", context)

换句话说:如果我去add-or-edit,那么我想要我的空表单,如果我去add-or-edit1,我想让表单填充ID为1的对象的数据。 我已经用两个不同的视图来做这件事了,一个是... ... edit_view(request, id) 其二 add-or-edit_view(request),当然这不是DRY。

PS

如果我使用:

def event_edit_view(request, id='None'):

    obj = get_object_or_404(Model, id=id)
    form = MyForm(request.POST or None, instance=obj)

那么如果我访问没有参数的URL,Django会抱怨。

ValueError at /add-or-create/

Field 'id' expected a number but got 'None'.

PS 2

如果我用:

def add-or-edit_view(request, id='None'):

    if id =='None':
        [unbound form]
    else:
        [bound form]

那么我就得到:

AttributeError at /add-or-edit/

'NoneType' object has no attribute 'has_header'
django django-forms django-views django-urls
1个回答
0
投票

你可以使用相同的视图,但必须在下面创建两个条目 urls.py,只有这样你才能访问带或不带参数的页面(id 在你的情况下。答卷

而在视图中,你必须做这样的事情。

def add_or_edit_view(request, id=None):
    if id is None:
        # "create view"
        if request.method == 'POST':
            # stuff
        else:
            # other stuff
    else:
        # edit view
        if request.method == 'POST':
            # stuff
        else:
            # other stuff

也别忘了检查 文件 关于如何处理视图中的表单。

© www.soinside.com 2019 - 2024. All rights reserved.