简体   繁体   English

模型形式的Django必填字段

[英]Django required field in model form

I have a form where a couple of fields are coming out as required when I don't want them too. 我有一个表格,其中的两个字段在我不希望出现时也按要求列出。 Here is the form from models.py 这是来自models.py的表格

class CircuitForm(ModelForm):
    class Meta:
        model = Circuit
        exclude = ('lastPaged',)
    def __init__(self, *args, **kwargs):
        super(CircuitForm, self).__init__(*args, **kwargs)
        self.fields['begin'].widget = widgets.AdminSplitDateTime()
        self.fields['end'].widget = widgets.AdminSplitDateTime()

In the actual Circuit model, the fields are defined like this: 在实际的电路模型中,字段的定义如下:

begin = models.DateTimeField('Start Time', null=True, blank=True)
end = models.DateTimeField('Stop Time', null=True, blank=True)

My views.py for this is here: 我的views.py在这里:

def addCircuitForm(request):
    if request.method == 'POST':
        form = CircuitForm(request.POST)
        if form.is_valid():
            form.save()
            return HttpResponseRedirect('/sla/all')
    form = CircuitForm()    
    return render_to_response('sla/add.html', {'form': form})

What can I do so that the two fields aren't required? 我该怎么做,以便不需要这两个字段?

If you don't want to modify blank setting for your fields inside models (doing so will break normal validation in admin site), you can do the following in your Form class: 如果您不想修改模型中字段的空白设置(这样做会破坏管理站点中的常规验证),则可以在Form类中执行以下操作:

def __init__(self, *args, **kwargs):
    super(CircuitForm, self).__init__(*args, **kwargs)

    for key in self.fields:
        self.fields[key].required = False 

The redefined constructor won't harm any functionality. 重新定义的构造函数不会损害任何功能。

If the model field has blank=True, then required is set to False on the form field. 如果模型字段的空白为True,则在表单字段上将required设置为False。 Otherwise, required=True 否则,required = True

Says so here: http://docs.djangoproject.com/en/dev/topics/forms/modelforms/ 在这里这样说: http : //docs.djangoproject.com/en/dev/topics/forms/modelforms/

Looks like you are doing everything right. 看来您做对了所有事情。 You could check the value of self.fields['end'].required . 您可以检查self.fields['end'].required

Expanding on DataGreed's answer, I created a Mixin that allows you to specify a fields_required variable on the Meta class like this: 扩展DataGreed的答案,我创建了一个Mixin,它允许您在Meta类上指定一个fields_required变量,如下所示:

class MyForm(RequiredFieldsMixin, ModelForm):

    class Meta:
        model = MyModel
        fields = ['field1', 'field2']
        fields_required = ['field1']

Here it is: 这里是:

class RequiredFieldsMixin():

    def __init__(self, *args, **kwargs):

        super().__init__(*args, **kwargs)

        fields_required = getattr(self.Meta, 'fields_required', None)

        if fields_required:
            for key in self.fields:
                if key not in fields_required:
                    self.fields[key].required = False

It's not an answer, but for anyone else who finds this via Google, one more bit of data: this is happening to me on a Model Form with a DateField. 这不是一个答案,但是对于任何其他通过Google找到它的人来说,还有一点点数据:这是我在带有DateField的模型表单上发生的。 It has required set to False, the model has "null=True, blank=True" and the field in the form shows required=False if I look at it during the clean() method, but it's still saying I need a valid date format. 它必须设置为False,模型具有“ null = True,空白= True”,并且如果我在clean()方法中查看它,则表单中的字段将显示required = False,但它仍然表示我需要一个有效日期格式。 I'm not using any special widget and I get the "Enter a valid date" message even when I explicitly set input_formats=['%Y-%m-%d', '%m/%d/%Y', '%m/%d/%y', ''] on the form field. 我没有使用任何特殊的小部件,即使我显式设置了input_formats = ['%Y-%m-%d','%m /%d /%Y',' %m /%d /%y','']在表单字段上。

EDIT: Don't know if it'll help anyone else, but I solved the problem I was having. 编辑:不知道是否会帮助其他人,但我解决了我遇到的问题。 Our form has some default text in the field (in this case, the word "to" to indicate the field is the end date; the field is called "end_time"). 我们的表单在该字段中有一些默认文本(在这种情况下,单词“ to”表示该字段是结束日期;该字段称为“ end_time”)。 I was specifically looking for the word "to" in the form's clean() method (I'd also tried the clean_end_time() method, but it never got called) and setting the value of the clean_data variable to None as suggested in this Django ticket . 我专门在表单的clean()方法中寻找“ to”一词(我也尝试过clean_end_time()方法,但从未被调用过),并将clean_data变量的值设置为None,如本Django所建议的那样 However, none of that mattered as (I guess) the model's validation had already puked on the invalid date format of "to" without giving me a chance to intercept it. 但是,这些都不重要,因为(我猜)该模型的验证已经采用了“ to”的无效日期格式,而没有给我机会来拦截它。

This is a bug when using the widgets: 使用小部件时,这是一个错误:

workaround: Using Django time/date widgets in custom form 解决方法: 以自定义形式使用Django时间/日期小部件

or ticket 12303 或票12303

From the model field documentation , 模型领域文档中

If you have a model as shown below, 如果您有如下所示的模型,

class Article(models.Model):
    headline = models.CharField(
        max_length=200,
        null=True,
        blank=True,
        help_text='Use puns liberally',
    )
    content = models.TextField()

You can change the headline's form validation to required=True instead of blank=False as that of the model as defining the field as shown below. 您可以按照定义字段的方式将标题的表单验证更改为required=True而不是blank=False ,因为该模型的定义如下所示。

class ArticleForm(ModelForm):
    headline = MyFormField(
        max_length=200,
        required=False,
        help_text='Use puns liberally',
    )

    class Meta:
        model = Article
        fields = ['headline', 'content']

So answering the question, 所以回答这个问题,

class CircuitForm(ModelForm):
    begin = forms.DateTimeField(required=False)
    end = forms.DateTimeField(required=False)
        class Meta:
            model = Circuit
            exclude = ('lastPaged',)

this makes begin and end to required=False 这使得beginendrequired=False

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM