Форма Джанго без обязательных полей - PullRequest
3 голосов
/ 29 августа 2010

Я хочу сделать форму, используемую для фильтрации поиска, без каких-либо полей.Например, учитывая этот код:

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, поэтому мне не нужно гигантское текстовое поле.Я переопределил дату в основном потому, что не хотел возиться с датами (я ненавижу работать с датами! Кто не?) И я изменил поле вакансий, потому что в противном случае я получал выпадающий список существующих вакансий, и я действительнохотел иметь возможность поиска по общим словам.Таким образом, я смог пометить все эти поля как необязательные

Проблема в том, что они помечают все остальные мои поля как обязательные, поскольку в модели им не разрешено оставаться пустыми.модель они не могут быть пустыми.Если они пустые, то данные плохие, и я не хочу их в БД.Однако форма является только формой фильтра на странице для отображения данных.Я никогда не буду спасаться от этой формы, поэтому мне все равно, будут ли поля пустыми или нет.Так есть ли простой способ сделать все поля обязательными = ложными, при этом используя класс Meta: model = Формат сообщения в форме?Очень удобно, что я могу сделать форму непосредственно из модели.

Кроме того, это моя первая серьезная попытка приложения django, так что если что-то нелепо неправильно, будьте добры:)

Ответы [ 3 ]

5 голосов
/ 29 августа 2010

Вы можете создать собственную 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
2 голосов
/ 08 июня 2013

Вы также можете передать empty_permitted=True при создании экземпляра формы, например,

form = MessageSearch(empty_permitted=True)

таким образом, вы можете иметь нормальные правила проверки, когда кто-то вводит данные в форму.

0 голосов
/ 02 августа 2017

Я бы попробовал модуль 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()

обязательно, скрытые фильтры можно определить, если вы хотите сузить список моделей в зависимости от чего-то вроде прав пользователя и т. Д.

также: настройте фильтрв отношении «обратного» отношения (внешний ключ отсутствует в отфильтрованной модели: на модель ссылаются в другом месте в другой таблице), это просто, просто назовите таблицу, в которой внешний ключ поля отфильтрованной модели имеет вид:

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

быстро расширяемый и чистый для настройки.пожалуйста, обратите внимание, что я не писал этот модуль, я просто очень доволен им:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...