Как исправить эту проблему с чистым методом в forms.ModelForm? - PullRequest
0 голосов
/ 01 июня 2019

Я делаю приложение для загрузки изображений. Мне нужна проверка одного из двух полей. По файлу или по URL. Я написал такой код, но метод view не вызывает clean_image в forms.py. Спасибо за помощь (извините за мой плохой английский)

forms.py

class UploadForm(forms.ModelForm):
    image = forms.ImageField(required=False)
    url = forms.CharField(max_length=64, required=False)

    class Meta:
        model = Image
        fields = (
            'image',
            'url'
        )

    def clean_image(self):
        image = self.cleaned_data.get('image')
        url = self.cleaned_data.get('url')
        if (image != None and url != '') or (image == None and url == ''):
            raise forms.ValidationError('Fill one field')

    def save(self):
        self.clean_image()
        new_image = Image.objects.create(
            image=self.cleaned_data.get('image'),
            url=self.cleaned_data.get('url')
        )
        return new_image

views.py

def upload(request):
    if request.method == 'POST':
        upload_form = UploadForm(request.POST, request.FILES)
        if upload_form.is_valid():
            upload_form.save()
            return redirect('/')
    else:
        upload_form = UploadForm()
    context = {
        'form': upload_form,
    }
    return render(request, 'upload_page.html', context)

1 Ответ

0 голосов
/ 01 июня 2019

Может быть, вы можете использовать clean() метод:

def clean(self):
    cleaned_data = super().clean()
    image = cleaned_data.get('image')
    url = cleaned_data.get('url')
    if not image and not url:
        raise forms.ValidationError('Fill either url or image field')
    return cleaned_data

и обновить шаблон, чтобы показать ошибку:

{% if form.errors %}
    {% for error in form.non_field_errors %}
        <div class="alert alert-danger">
            <strong>{{ error|escape }}</strong>
        </div>
    {% endfor %}
{% endif %}
...