没有必填字段的 Django 表单

标签 django django-forms

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

模型.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 = Message 格式?我可以直接从模型制作表格,这真的很方便。

这也是我第一次认真尝试 Django 应用程序,所以如果有什么荒谬的错误,请善待 :)

最佳答案

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

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

关于没有必填字段的 Django 表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3596214/

相关文章:

python - 如何让Django中的选择字段不显示所有数据,而仅显示与选择字段相关的数据?

Django模型: is inline adding related model possible?

python - Django DateField 默认选项

django - 我如何强制 nginx 使用来自上游服务器的 header 将响应保存在缓存文件夹中?

python - Postgres 性能

django - 如何在 View 中包装 Django FormPreview

python - 网站需要在 python 中更新

python - 删除模板中的空 ModelChoiceField

Django 表单不调用 clean_<fieldname>

Django UpdateView 不允许空字段