【问题标题】:override django-allauth default forms覆盖 django-allauth 默认表单
【发布时间】:2014-01-05 02:11:59
【问题描述】:

我想覆盖 django-allauth 的默认形式,以便在不更改 allauth 形式的初始代码的情况下更改\添加默认小部件属性、类变量。 我该怎么做?

我的工作区:
1) 安装django-allauth,通过pip打包;
2) 配置设置,根据github上项目的建议;
3) 本地创建的模板登录、注册;
4) 创建forms.py,它定义了一个子类forms django-allauth

从 allauth.account 导入 SigninForm 类 mySigninForm (SigninForm): 用户名 = ...//覆盖变量

这样对吗?

谢谢!

【问题讨论】:

  • 是的,覆盖 allauth 表单类是最简单、最通用的方法。

标签: django django-forms django-allauth


【解决方案1】:

如果您想使用 allauth 表单提供的方法或功能,那么像您当前一样覆盖表单类是您的最佳选择。

from allauth.account.forms import LoginForm
from django import forms
from myapp.forms import widgets


class MyLoginForm(LoginForm):

    // Override attributes
    existing_field = forms.CharField(widget=widgets.CustomWidget())

    // Add Custom Attributes
    new_field = forms.CharField(widget=widgets.CustomWidget())

如果你想要一个完全自定义的表单,你可以使用自定义的 django 表单,然后在视图中使用它。例如:

表格

from django import forms
from myapp.forms import widgets

class MyLoginForm(forms.Form):
    // Add atributes and methods
    some_field = forms.CharField(widget=widgets.CustomWidget())

观看次数

from django.views.generic.edit import FormView
from myapp.forms import MyLoginForm

LoginUser(FormView):
    form = MyLoginForm

【讨论】:

  • 感谢您的回复!但是,如何在不覆盖子窗体类中的变量的情况下向父小部件添加属性?
  • 我已经更新了答案,说明如何使用带有覆盖和新字段的自定义小部件。
  • 你怎么能这样覆盖allauth登录表单?
  • @Amyth 我试过了,但我卡住了,也许是在一个愚蠢的点上,但我该如何引用视图?因为我需要替换 allauth url,所以我可能会在 allauth url 之前输入一个 url;类似: url(r'^accounts/login/$', view=views.MyLoginForm.as_view(), name='myloginform') 除了这不起作用...请提出建议。
  • @musicformellons 是的。如果您覆盖视图,您要么需要覆盖现有的 url,要么创建一个新的 url 来访问视图。
【解决方案2】:

您可以通过创建自己的模板文件树来覆盖任何(或全部)allauth 默认模板。

层次结构的命名必须匹配allauth,例如这是我的项目:

allauthdemo/templates/
├── allauth
│   ├── account
│   └── socialaccount
├── my
├── other
├── template
└── dirs

settings.py 中的模板设置必须包含这些目录,例如:

TEMPLATES = [
    {
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    'DIRS': [
        os.path.join(BASE_DIR, 'allauthdemo', 'templates', 'allauth'),
        os.path.join(BASE_DIR, 'allauthdemo', 'templates'),
    ],
    ...

This allauth demo on github 展示了如何做到这一点。免责声明:我编写了那个演示。

【讨论】:

    猜你喜欢
    • 2016-07-29
    • 2012-03-15
    • 2014-06-28
    • 1970-01-01
    • 2016-09-16
    • 2016-06-04
    • 2013-08-03
    • 2010-12-01
    • 2019-05-22
    相关资源
    最近更新 更多