使用相同的形式在 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
中创建两个条目,然后您才能访问带或不带参数的页面(在您的情况下为 id
,example 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 关于如何在视图中处理表单的内容。
我想使用相同的表单向数据库添加新记录和编辑现有记录。要编辑的记录的 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
中创建两个条目,然后您才能访问带或不带参数的页面(在您的情况下为 id
,example 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 关于如何在视图中处理表单的内容。