【问题标题】:django how to create and use form from existing modeldjango 如何从现有模型创建和使用表单
【发布时间】:2013-09-25 05:08:27
【问题描述】:

我正在尝试学习 Django,我现在正在阅读此链接: https://docs.djangoproject.com/en/1.5/topics/forms/modelforms/

如果您在提供的链接中向下滚动,则会显示验证表单涉及两个主要步骤,第一步是“验证表单”,这会导致此链接: https://docs.djangoproject.com/en/1.5/ref/forms/validation/#form-and-field-validation

它说每次验证的第一步是在字段上使用 to_python() 方法。我不明白他们说的是什么意思

“它会强制值以更正数据类型并在不可能的情况下引发 ValidationError。此方法接受来自小部件的原始值并返回转换后的值。”

所以假设我有一个这样的模型

class User(models.Model):
    user_id = models.AutoField(unique=True, primary_key=True)
    username = models.SlugField(max_length=50, unique=True)
    first_name = models.CharField(max_length=50)

我创建了一个这样的表单

class UserForm(forms.ModelForm):
    class Meta:
        model = User

现在,我该如何使用 to_python() 方法?我在视图中使用它吗?还是我必须在 forms.py 文件中使用它?如果我在视图中使用它,会调用什么函数?

【问题讨论】:

    标签: python django validation django-models django-forms


    【解决方案1】:

    Django 会自动验证和反序列化字段输入。

    发布表单时的示例视图:

    def my_view(request):
       form = UserForm() 
       if request.method == 'POST':
           form = UserForm(request.POST)
    
            if form.is_valid(): # here to_python() is run for each field
                form.save()
                # redirect
    
       return render_to_response('home.html', { 'form': form })
    

    【讨论】:

    • 啊,好吧。因此,如果表单无效,我将如何在屏幕上输出错误消息?使用 run_validators() 然后打印 ValidationError?或者有没有办法只用 is_valid() 方法来做到这一点?
    • 如果表单无效,它会在呈现表单时向自身填充错误消息。请参阅 django 文档中的官方教程以查看示例。 Django 拥有最全面的文档。
    【解决方案2】:

    您无需担心to_python(),除非您正在创建custom field。如果要使用 ModelForm 创建简单的表单,可以使用 clean 方法。

    如果您只想验证一个字段,您可以这样做:

    class UserForm(forms.ModelForm):
    
        def clean_username(self):
            username = self.cleaned_data['username']
            if len(username) > 10:
                raise forms.ValidationError("Please shorten your username")
    
            # Always return the cleaned data, whether you have changed it or
            # not.
            return username
    

    如果你想清理多个字段,你可以这样做:

    class Userform(forms.Form):
        # Everything as before.
        ...
    
        def clean(self):
            cleaned_data = super(UserForm, self).clean()
            username = cleaned_data.get("username")
            first_name = cleaned_data.get("first_name") 
    
            if len(username) > 10:
                raise forms.ValidationError("Please shorten your username")
    
            if len(first_name) < 1:
                raise forms.ValidationError("First name is too short")
    
            # Always return the full collection of cleaned data.
            return cleaned_data
    

    【讨论】:

      猜你喜欢
      • 2020-07-18
      • 1970-01-01
      • 2014-02-12
      • 1970-01-01
      • 1970-01-01
      • 2012-08-21
      • 1970-01-01
      • 2015-08-17
      • 2023-04-05
      相关资源
      最近更新 更多