Django: Как проверить, оставил ли пользователь все поля пустыми (или начальными значениями)?

Я знаю, что is_valid() в ограниченной форме проверяет, вводятся ли все необходимые данные. Это не то, что я хочу. Я хочу проверить, было ли заполнено поле в форме.

Любые идеи?

развивавший:

Я хочу дать пользователю возможность не заполнять форму вообще. Однако, если они пытаются заполнить его (т.е. Изменили значение в поле из него начальное значение --- обычно пустое значение), я хочу проверить его.

Вид будет примерно таким:

def get_opinion(request):

    if request.method == 'POST':
        f = OpinionForm(request.POST)
        if form_is_blank(f):
            return HttpResponseRedirect(reverse('thank_you_anyway'))
        elif f.is_valid():
            #Process here
            return HttpResponseRedirect(reverse('thanks_for_participating'))
    else:
        initial = {'weekday': date.today().strftime('%A')}
        f = OpinionForm(initial=initial)

    return render_to_response(
        'get_opinion.html',
        {'form': f,},
        RequestContext(request)
    )

То, что я хочу, это часть form_is_blank().

Ответы

Ответ 1

Думаю, я должен ответить на собственный вопрос.

По-видимому, существует недокументированная функция Form: has_changed()

>>> f = MyForm({})
>>> f.has_changed()
False
>>> f = MyForm({})
>>> f.has_changed()
False
>>> f = MyForm({'name': 'test'})
>>> f.has_changed()
True
>>> f = MyForm({'name': 'test'}, initial={'name': 'test'})
>>> f.has_changed()
False

Итак, это будет хорошо, как замена для form_is_blank() (вернувшись, конечно).

Ответ 2

Чтобы получить эту функциональность для подмножества форм, используемых в фактической <form> тег вам также необходимо определить

class YourForm(forms.ModelForm):
    def full_clean(self):
        if not self.has_changed():
            self._errors = ErrorDict()
            return

        return super(YourForm, self).full_clean()

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

Ответ 3

Вы должны установить required = False для всех полей формы и переопределить метод clean для выполнения специальной проверки. Подробнее см. текущую документацию.

Ответ 4

Если вы положили required=True в поле формы или в модель blank=False, поэтому is_valid() должен возвращать False.