覆盖Django基于类的视图窗口小部件

dav*_*hes 15 django

假设我有一个基本的CreateView表单,允许新用户在网站上注册:

from django.contrib.auth import get_user_model
from django.http import HttpResponse
from django.views.generic import CreateView

User = get_user_model()


class Signup(CreateView):

    model = User
    fields = ['first_name', 'last_name', 'email', 'password']
Run Code Online (Sandbox Code Playgroud)

我刚试过这个,发现密码字段是用纯文本呈现的; 我将如何重写视图,以便它使用forms.PasswordInput()代替?(我意识到手动定义表单可能最简单,但我只是对你如何做到这一点感到好奇.)

jpr*_*itt 40

您可以覆盖get_form()并修改表单以更改密码字段上的小部件:

from django import forms

class Signup(CreateView):
    model = User
    fields = ['first_name', 'last_name', 'email', 'password']

    def get_form(self, form_class):
        form = super(Signup, self).get_form(form_class)
        form.fields['password'].widget = forms.PasswordInput()
        return form
Run Code Online (Sandbox Code Playgroud)

但更好的方法是创建一个自定义表单类.在自定义类刚刚设置widgetsMeta类.像这样:

from django import forms

class SignupForm(forms.ModelForm):
    class Meta:
        model = User
        fields = ['first_name', 'last_name', 'email', 'password']
        widgets = {
            'password': forms.PasswordInput()
        }

class Signup(CreateView):
    form_class = SignupForm
    model = User
Run Code Online (Sandbox Code Playgroud)

通常,您也会将自定义表单类放在forms.py文件中.


kbu*_*lds 5

不确定这是否会影响 Django 的早期版本,但在更新的版本中,重写该方法时get_form()应该有一个默认值form_class=None

更新后的(Python 3,Django 2.2)示例将是:

from django import forms

class Signup(CreateView):
    model = User
    fields = ['first_name', 'last_name', 'email', 'password']

    def get_form(self, form_class=None):
        form = super().get_form(form_class)
        form.fields['password'].widget = forms.PasswordInput()
        return form
Run Code Online (Sandbox Code Playgroud)

https://docs.djangoproject.com/en/2.2/ref/class-based-views/mixins-editing/#django.views.generic.edit.FormMixin