Django-Userena:覆盖配置文件编辑表单

时间:2013-07-16 15:43:40

标签: django forms url

这是我第一次使用Userena,我试图覆盖个人资料编辑表单,因此不会显示照片或隐私设置。这是我到目前为止的尝试(来自此页http://tundebabzy.blogspot.com/2013/04/an-easy-way-to-override-third-party-app.html)。

我使用以下网址创建了一个拦截网址'accounts/user/edit'的应用:

url(r'^accounts/(?P<username>[\.\w-]+)/edit/$',{'edit_profile_form': CustomEditProfileForm,} ,name='userena_profile_edit')

自定义修改表单:

class CustomEditProfileForm(userena_views.EditProfileForm):
""" Base form used for fields that are always required """

class Meta:
    model = get_profile_model()
    exclude = ['user', 'mugshot', 'privacy', 'first_name']

自定义视图:

def profile_edit(request, username, edit_profile_form= forms.CustomEditProfileForm,
             template_name='userena/profile_form.html', success_url=None,
             extra_context=None, **kwargs):

return userena_views.profile_edit(request=request, username=username,
        edit_profile_form=edit_profile_form, template_name=template_name,
        success_url=success_url, extra_context=extra_context)

我可以从这里获得编辑表格,但表格看起来仍然一样。有人可以帮忙吗?提前谢谢!

1 个答案:

答案 0 :(得分:4)

Userena基础表单应该从userena.forms导入,而不是从userena.views导入(也许这只是一个错字):

from userena.forms import EditProfileForm

Meta类是可以的,但这样你就完全覆盖了它。一般来说,我更喜欢像这样扩展Meta类:

class Meta(EditProfileForm.Meta):
  exclude = EditProfileForm.Meta.exclude + ['mugshot', 'privacy', 'first_name']

所以没有必要重复基类正在做的事情,如果在将来的版本中发生变化,风险就会降低。

最后,您不需要创建自定义视图,只需在URL定义中指定自定义表单:

url(r'^accounts/(?P<username>[\.\w-]+)/edit/$',
   'userena.views.profile_edit',
   {'edit_profile_form': CustomEditProfileForm},
   name='userena_profile_edit'),

注意第二行'userena.views.profile_edit',引用正常的Userena视图。