Установка определенного правила валидации в 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 в запросе, потому что это означает, что один уже существует, а это второй.

Вернуться на верх