我正在尝试为Django 1.6.1中的UpdateView
类构建django.contrib.auth.User
。 UpdateView
重复使用创建模板并使用UpdateForm
来编辑不必要的字段。管理员应该使用此UpdateView
来更新系统上所有其他用户的用户名和电子邮件。
我可以通过在URL字段中指定用户PK来导航到表单。这意味着我到达一个页面,其中编辑表单填充了PK指定的用户详细信息。但是,当我提交表单时,Django将我带到一个没有用户PK的更新URL,这会抛出404.
# urls.py
url(r'^update/(?P<pk>[\d]+)$', UpdateUserView.as_view(), name='update_user'),
# views.py
class UpdateUserView(UpdateView):
model = User
form_class = UpdateForm
template_name = "create_user.html"
success_url = reverse_lazy('manage_users')
def get_context_data(self, **kwargs):
context = super(UpdateUserView, self).get_context_data(**kwargs)
instance = None
user_pk = self.kwargs.get('pk')
context['submit_name'] = 'Update Order'
if user_pk:
instance = get_object_or_404(User, pk=user_pk)
if self.request.POST:
context['form'] = UpdateForm(self.request.POST, instance=instance)
else:
context['form'] = UpdateForm(instance=instance)
return context
def form_valid(self, form):
context = self.get_context_data()
form = context['form']
if form.is_valid():
return redirect(reverse_lazy('manage_users'))
else:
return self.render_to_response(self.get_context_data(form=form))
# forms.py
class UpdateForm(ModelForm):
class Meta:
model = User
fields = ("username","email")
def __init__(self, *args, **kwargs):
super(UpdateForm, self).__init__(*args, **kwargs)
self.helper = FormHelper()
self.helper.form_class = 'form-create'
self.helper.form_method = 'post'
self.helper.form_action = '.'
self.helper.layout = Layout(
Fieldset(
'',
Field('username', css_class='form-control'),
Field('email', css_class='form-control'),
),
ButtonHolder(
Submit('submit', 'Update User')
),
)
答案 0 :(得分:1)
您正在使用action="."
表单,但会从网址中删除主键,因为网址格式没有尾部斜杠。
您可以在网址格式中添加尾部斜杠
/update/(?P<pk>[\d]+)/$
或在表单助手中更改表单的操作:
self.helper.form_action = ""
或明确:
self.helper.form_action = reverse('update_user', args=(self.instance.pk,))