Установка определенного правила валидации в UpdateView
Я устанавливаю класс UpdateView для обновления данных маркеров пользователя. У меня есть модель Marker с полем category. Я хочу иметь один и единственный маркер категории "Где я живу" во всех маркерах пользователя. Есть ли способ создать функцию в классе UpdateView, чтобы сделать форму недействительной, если есть более одного маркера "Где я живу".
class UpdateMarkerView(UpdateView):
model = Marker
fields = ["name", "description", "category"]
template_name = "map/detail.html"
success_url = "/"
class Marker(models.Model):
WIL = "WIL"
WIWG = "WIWG"
WIW = "WIW"
IDK = "IDK"
CATEGORY_MARKER = [(WIL,"Where I live"), (WIWG, "Where I want to go"),(WIW,"Where I went"),(IDK,"I don't know")]
user = models.ForeignKey(User,blank=True, null=True,on_delete = models.SET_NULL)
name = models.fields.CharField(max_length=100)
description = models.fields.CharField(max_length=100)
lat = models.fields.DecimalField(default=False, max_digits=5, decimal_places=3)
lon = models.fields.DecimalField(default=False, max_digits=5, decimal_places=3)
category = models.CharField(max_length=50, choices = CATEGORY_MARKER, default = IDK)
Я уже сделал это с помощью базовой функции, но не могу найти способ сделать это с помощью общего представления, если это возможно.
Для общего ответа можно использовать метод form_valid
.
Но если вы хотите вернуть недействительную форму, когда было более 1 категории "Где я живу", вы можете написать так:
class UpdateMarkerView(UpdateView):
model = Marker
fields = ["name", "description", "category"]
template_name = "map/detail.html"
success_url = "/"
def form_valid(self, form):
data = form.cleaned_data
if data.get("category") == "WIL":
if Marker.objects.filter(category="WIL").count() >= 1:
form.add_error('category', 'This category already exists.')
return self.form_invalid(form)
else:
return super().form_valid(form)
Сначала мы проверяем, что категория, выбранная пользователем, является "WIL", затем если есть более 1 категории (WIL), мы добавляем ошибку в форму и возвращаем недействительную форму.
Вы также можете заменить count
на exists
в запросе, потому что это означает, что один уже существует, а это второй.