Как сделать динамическую проверку формы django? - PullRequest
4 голосов
/ 04 июня 2010

У меня есть форма, которая должна иметь действительный URL-адрес или действительный файл для загрузки:

class ResourceUpload(ModelForm):
   ...        
   uploadedfile = forms.FileField('file')
   url_address = forms.URLField('url') 
   ...

Как я могу переопределить валидаторы FileField и URLField, чтобы Django выдавал ошибку только в том случае, если оба поля выше недействительны, но исключает одно недействительное до тех пор, пока другое действительно?

Ответы [ 4 ]

7 голосов
/ 16 июля 2012

мое решение
плюсы: он оставляет звездочку для действительно обязательного поля и сообщения об ошибках по умолчанию

class Form(forms.ModelForm):
    field1 = SelectField
    field2 = ...
    field3 = ...

    def __init__(self, *args, **kwargs):
        super(Form, self).__init__(*args, **kwargs)
        if kwargs['data']:
            if kwargs['data'].get('field1') == '1':
                self.fields['field2'].required = True
                self.fields['field3'].required = False
            elif kwargs['data'].get('field1') == '2':
                self.fields['field2'].required = False
                self.fields['field3'].required = True
7 голосов
/ 04 июня 2010

Вам нужно будет установить оба параметра как required=False, чтобы сервер базы данных не нуждался в их заполнении, а затем используйте очистку формы :

import forms

class ResourceUpload(ModelForm):
   ...        
   uploadedfile = forms.FileField(required = False, upload_to='put/files/here')
   url_address = forms.URLField(required = False) 
   ...

   def clean(self):
       cleaned_data = self.cleaned_data
       uploadedfile = cleaned_data.get("uploadedfile ")
       url_address = cleaned_data.get("url_address ")

       if not uploadedfile and mot url_address :
           raise forms.ValidationError("Provide a valid file or a valid URL.")

       return cleaned_data          
4 голосов
/ 21 августа 2013

Вот мое решение, которое действительно работает ... (проверено)

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

    if self.data and self.data.get('field_name') != 'SOMETHING':
        self.fields.get('field_name2').required = True

Это делает field_name2 обязательным полем, если field_name не было 'SOMETHING'. Джанго качается!

0 голосов
/ 09 декабря 2018

Вам следует взглянуть на этот пакет django-dynamic-model-validation

from django.db import models
from dynamic_validator import ModelFieldRequiredMixin


class MyModel(ModelFieldRequiredMixin, models.Model):
    uploadedfile = models.FileField(upload_to='upload/path', blank=True, default='')
    url_address = models.URLField(blank=True, default='') 

    REQUIRED_TOGGLE_FIELDS = ['uploadedfile', 'url_address']

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

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