【问题标题】:Form validate like GenericView像 GenericView 一样进行表单验证
【发布时间】:2017-07-28 09:39:39
【问题描述】:

使用通用视图时,您会获得 django 的简洁功能,可以在模板中发布错误消息,例如“此字段是必需的!”。

据我了解,CreateView 继承了一个名为 form_invalid 的方法,该方法返回 self.render_to_response(self.get_context_data(form=form)) 而我只是猜测这就是魔法?

现在我正在编写一个表单,想知道是否也可以使用该功能?

我创建了一个 custom_user 模型,并尝试创建一个简单的创建功能。到目前为止,我得到了:

模型.py

class Custom_User(AbstractBaseUser):

    email = models.EmailField(max_length=250, unique=True)
    password = models.CharField(max_length=100)

    USERNAME_FIELD = 'email'

forms.py

class create_User_Form(forms.ModelForm):

    confirm_password = forms.CharField(widget = forms.PasswordInput(attrs={'class' :'form-control'}))

    class Meta:
        model = Custom_User
        fields = ['email', 'password']

        widgets = {
                   'email' : forms.TextInput(attrs={'class' :'form-control'}),
                   'password' : forms.PasswordInput(attrs={'class' :'form-control'}),
        }

    def clean(self):
        cleaned_data = super(create_User_Form, self).clean()
        password = cleaned_data.get("password")
        confirm_password = cleaned_data.get("confirm_password")

        if password != confirm_password:
            raise forms.ValidationError(
                "password and confirm_password does not match"
            )

        return self.cleaned_data

urls.py

urlpatterns = [
            url(r'^$', views.index, name='index'),    

            url(r'^create_user/$', views.create_user, name='create_user'),  
]

views.py

def create_user(request):

    form = create_User_Form(request.POST)

    if form.is_valid():
        print('valid')
    else:
        print('error')        

    return redirect('Eapp:index')

def index(request):

    create_user_form_ = create_User_Form()

    context = {
               'create_user_form' : create_user_form_,
    }

    return render(request, 'index.html', context)

【问题讨论】:

  • 看看CreateView 中的docs。您可以在 View 类中指定form_class
  • @gitblame 我不太了解文档,对此感到抱歉。我已经使用呈现我的索引页面的视图功能编辑了我的帖子。这就是我想在其中显示 CreateView 的那个。这会使事情变得更加复杂吗?
  • 如果你需要一些教程,我推荐观看thesegodjango关于CBVs的教程。
  • 您可能需要了解基于类和基于函数的视图之间的区别。 docs.djangoproject.com/en/1.10/topics/class-based-views/intro

标签: django django-forms django-class-based-views


【解决方案1】:

您似乎混淆了基于函数的视图和基于类的视图。您尝试的是功能基础视图。要完整,它需要看起来像这样

def create_user(request):
    if request.method == 'POST':
        create_user_form_ = create_User_Form(request.POST)
        if form.is_valid():
            print('valid')
            return redirect('Eapp:index')
        else:
            print('error')        

    else:
        create_user_form_ = create_User_Form()

    context = {
               'create_user_form' : create_user_form_,
    }

    return render(request, 'index.html', context)

请注意,这结合了您的索引和创建用户方法,因为它们包含需要一起使用的功能。

另一方面,如果您想使用CreateView,您的代码会变得更短

class UserCreate(CreateView):
    model = Custom_User
    form_class = create_User_Form

真的是这样。但是您可以添加改进。

作为旁注。在 python 中命名类的标准方法是 CreateUserForm

【讨论】:

  • 感谢您的回答。我把事情搞混了。我认为 View 提供了某种额外的功能。但我发现如果我返回无效的表格,它会显示错误。不知道表格可以像那样“回收”。
  • 很高兴能帮上忙。祝您的项目一切顺利
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-21
  • 2018-05-11
  • 2015-06-25
  • 2017-02-04
  • 2012-10-12
  • 2014-02-04
  • 2015-07-31
相关资源
最近更新 更多