我想在数据库中添加新记录和编辑现有记录时使用相同的表单。要编辑的记录的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'
你可以使用相同的视图,但必须在下面创建两个条目 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
也别忘了检查 文件 关于如何处理视图中的表单。