Django表格没有必填字段

时间:2010-08-29 19:22:04

标签: django django-forms

我想制作一个用于过滤搜索的表单,而不需要任何字段。例如,给出此代码:

models.py:

class Message(models.Model):
    happened = models.DateTimeField()
    filename = models.CharField(max_length=512, blank=True, null=True)
    message = models.TextField(blank=True, null=True)
    dest = models.CharField(max_length=512, blank=True, null=True)
    fromhost = models.ForeignKey(Hosts, related_name='to hosts', blank=True, null=True)
    TYPE_CHOICES = ( (u'Info', u'Info'), (u'Error', u'Error'), (u'File', u'File'), (u'BPS', u'BPS'),)
    type = models.CharField(max_length=7, choices=TYPE_CHOICES)
    job = models.ForeignKey(Jobs)

views.py:

WHEN_CHOICES = ( (u'', ''), (1, u'Today'), (2, u'Two days'), (3, u'Three Days'), (7, u'Week'),(31, u'Month'),)

class MessageSearch(ModelForm): #Class that makes a form from a model that can be customized by placing info above the class Meta
        message = forms.CharField(max_length=25, required=False)
        job = forms.CharField(max_length=25, required=False)
        happened = forms.CharField(max_length=14, widget=forms.Select(choices=WHEN_CHOICES), required=False)
        class Meta:
            model = Message

这就是我现在的代码。如您所见,它基于模型制作表单。我重新定义了表单中的消息,因为我正在使用icontains过滤器,所以我不需要一个巨大的文本框。我重新定义日期主要是因为我不想乱用日期(我讨厌使用日期!谁没有?)我改变了工作领域,因为否则我得到了现有工作的下拉列表,我真的希望能够用常用词搜索。所以我能够将所有这些标记为不需要

问题是它是否按要求标记了我的所有其他字段,因为在模型中它们不允许为空白。

现在在模型中它们不能是空白的。如果它们是空白的那么数据是坏的,我不希望它在数据库中。但是,表单只是页面上的过滤器表单以显示数据。我永远不会从那个表格中保存,所以我不在乎字段是否为空白。那么是否有一种简单的方法可以使所有字段成为required = false,同时仍然使用类:Meta:model =表单中的消息格式?我可以直接从模型中制作表格,这非常方便。

这也是我对django应用程序的第一次认真尝试,所以如果出现荒谬的错误,请善待:)

3 个答案:

答案 0 :(得分:5)

您可以创建适合您需求的自定义ModelForm。此自定义ModelForm将覆盖save方法并将所有字段设置为非必需字段:

from django.forms import ModelForm

class SearchForm(ModelForm):
    def __init__(self, *args, **kwargs):
        super(SearchForm, self).__init__(*args, **kwargs)
        for key, field in self.fields.iteritems():
            self.fields[key].required = False

所以你可以通过简单地调用而不是ModelForm来声明你的表单,例如:

class MessageForm(SearchForm):
    class Meta:
        model = Message

答案 1 :(得分:2)

您还可以在实例化表单时传递empty_permitted=True,例如

form = MessageSearch(empty_permitted=True)

这样,当有人将数据输入表单时,您仍然可以拥有正常的验证规则。

答案 2 :(得分:0)

我会试试django-filter模块:

http://django-filter.readthedocs.io/en/develop/

字段不是必需的。这些都是过滤器。它看起来像这样:

import django_filters

class MessageSearch(django_filters.FilterSet):

    class Meta:
        model = Message
        fields = ['happened', 'filename', 'message', '...', ]

    # django-filter has its own default widgets corresponding to the field
    # type of the model, but you can tweak and subclass in a django way :
    happened = django_filters.DateFromToRangeFilter()
如果您想根据用户权限等内容缩小模型列表,则可以定义必需的隐藏过滤器。

另外:在'反向'上设置过滤器relationship(外键不在过滤模型中:模型在另一个表的其他地方引用),很简单,只需将过滤后的模型字段的外键命名为:

    # the 'tags' model has a fk like message = models.ForeignKey(Message...)
    tags= django_filters.<some filter>(name='tags')

快速扩展和清洁设置。 请注意我没有写过这个模块,我对它非常满意:)