#django #django-views #django-forms #django-urls #django-validation
#django #django-просмотры #django-forms #django-urls #django-валидация
Вопрос:
Необходимо добавить изображение в форму либо путем ввода ссылки на изображение, либо загрузить файл со своего компьютера. Если при отправке формы не было введено никаких параметров или были введены оба параметра, должно появиться сообщение об ошибке. И после успешной загрузки вы должны попасть на страницу изображения.
models.py:
class Picture(models.Model):
url = models.URLField(blank=True, verbose_name='Ссылка на изображение')
image = models.ImageField(upload_to='pictures/%Y/%m/%d', width_field='image_width', height_field='image_height',
blank=True, verbose_name='Изображение')
image_width = models.IntegerField(default=0, blank=True, verbose_name='Ширина изображения')
image_height = models.IntegerField(default=0, blank=True, verbose_name='Высота изображения')
is_active = models.BooleanField(default=True, verbose_name='Актуальность изображения')
created = models.DateField(blank=True, null=True, default=timezone.now, verbose_name='Дата создания записи')
updated = models.DateField(blank=True, null=True, default=timezone.now, verbose_name='Дата ред-ия записи')
views.py:
def add_picture(request):
picture = Picture.objects.filter(is_active=True)
if request.method == 'POST':
form = PictureCreateForm(data=request.POST, files=request.FILES)
if form.is_valid():
form.save()
return render(request, 'add_picture.html', locals())
else:
messages.error(request, 'Ошибка, проверьте данные')
else:
form = PictureCreateForm()
return render(request, 'add_picture.html', locals())
forms.py : Здесь вам нужно определить метод clean
class PictureCreateForm(forms.ModelForm):
class Meta:
model = Picture
fields = ('url', 'image')
def clean(self):
cd = self.cleaned_data
if cd['url'] and cd['image']:
raise forms.ValidationError('Ошибка!')
if not cd['url'] and not cd['image']:
raise forms.ValidationError('Ошибка!')
return cd
urls.py:
urlpatterns = [
path('', views.home, name='home'),
path('add_picture/', views.add_picture, name='add_picture'),
path('picture_detail/<int:id>/', views.picture_detail, name='picture_detail'),
]
Ответ №1:
Вы можете использовать clean(...)
метод forms.ModelForm
as
class PictureCreateForm(forms.ModelForm):
class Meta:
model = Picture
fields = ('url', 'image')
def clean(self):
cleaned_data = super().clean()
url = cleaned_data.get("url")
image = cleaned_data.get("url")
# do your logic here
# atlast
return cleaned_data
Комментарии:
1. Условие, при котором поле не вводится, работает. Но что, если введены два поля?
2. Поскольку
clean()
методurl
image
одновременно дает вам значение и, вы можете сделать все остальное, не так ли?3. Я не могу создать условие, при котором два поля остаются пустыми. В это время вам нужно выдать сообщение об ошибке. То есть, если url и изображение остаются пустыми, тогда вам нужно вызвать сообщение об ошибке.
4. Разобрался! Спасибо за ваше время ^^