使用相同的形式在 Django 中使用 URL 参数添加新记录和编辑现有记录

Using the same form for adding new records and editing existing ones in Django with URL parameter

我想使用相同的表单向数据库添加新记录和编辑现有记录。要编辑的记录的 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/1我想要表格填充来自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'

您可以使用相同的视图,但必须在 urls.py 中创建两个条目,然后您才能访问带或不带参数的页面(在您的情况下为 idexample answer

并且在视图中你必须做这样的事情:

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

也不要忘记查看 documentation 关于如何在视图中处理表单的内容。