【发布时间】:2020-09-01 10:38:30
【问题描述】:
我想使用相同的表单向数据库添加新记录和编辑现有记录。要编辑的记录的 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-edit/1 我想要用来自 id 1 对象的数据填充表单。我我已经在使用两种不同的视图进行此操作,一种是 edit_view(request, id),另一种是 add-or-edit_view(request),当然不是 DRY。
附言
如果我使用:
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'
【问题讨论】:
-
考虑使用位置参数
-
您能否添加有关“AttributeError at /add-or-edit/ 'NoneType' 对象没有属性 'has_header'”完整堆栈跟踪的更多详细信息
标签: django django-forms django-views django-urls