Nano Hash - криптовалюты, майнинг, программирование

Ошибка проверки для отношения один к одному в модели django from

У меня есть 2 модели, которые связаны друг с другом с помощью отношения «один к одному». Как я могу отобразить ошибку проверки, если объект одной модели уже связан с другой.

Предположим, у меня есть 2 модели

   Class Place(models.Model):
        field1 = CharField()
        field2 = CharField()

   Class Restaurant(models.Model):
       related_field = OneToOneField(Place)
       field3 = CharField()

В моем случае На одно место один ресторан. Если пользователь отправляет новый ресторан для того же места, проверка должна подняться

Если объект «Ресторан» уже прикреплен к объекту «Место», поэтому для второго ресторана для того же объекта «Место» я хочу отобразить проверку

В админке мы обычно видим это сообщение "Ресторан с этим местом уже существует." Но как я могу добиться того же, используя форму модели с общими представлениями?

 class RestaurantCreateView(CreateView):
       form_class = RestaurantForm
       template_name = 'restaurant_create.html'

       def get_success_url(self):
           return reverse_lazy('restuarants', args=[self.object.id])

       def get_place(self, **kwargs):
           id = self.kwargs['pk']
           place = Place.objects.get(id=id)
           return place 

       def get_context_data(self, **kwargs):
           context = super(RestaurantCreateView, self).get_context_data(**kwargs)
           place = self.get_place()
           context['place'] = place
           return context

       def form_valid(self, form):
          self.object = form.save(commit=False)
          place = self.get_place()
          self.object.place = place
          self.object.save()
          return HttpResponseRedirect(self.get_success_url())

Как можно выполнить проверку отношения «один к одному» в общих представлениях на основе классов?


  • Зачем вам здесь OneToOneField? Это означает, что издатели могут иметь только одну книгу, что кажется очень странным. 02.09.2012
  • это не совсем мои модели.. Я например так написал 02.09.2012
  • Ну, пожалуйста, опубликуйте что-нибудь, что действительно показывает, что вы хотите сделать. Ваше упоминание об издателе этой книги и ваш комментарий к Юдзи подразумевают, что вы на самом деле хотите использовать ForeignKey. 02.09.2012
  • @Daniel: я обновил вопрос, где я хочу один ресторан для одного места, для того же места другого ресторана не должно существовать. 02.09.2012
  • @SahilM, тогда мой код отвечает на ваш вопрос 03.09.2012
  • @YujiTomita: я не выставляю поле related_field в форме, чтобы пользователь мог его изменить. Поэтому, если я использую clean_data.get('related_field'), всегда будет None. 03.09.2012
  • @SahilM, хорошо, однако пользователь отправляет это поле related_field, запрашивает модель, чтобы получить объект, а затем делает то же самое. Каким-то образом пользователь в конечном итоге выбирает Place (иначе этой проверки вообще не было бы). 03.09.2012
  • @Yuji: пользователь не будет выбирать место. У меня есть подробная страница для объекта места, на той же странице я предоставил ссылку для создания ресторана, который будет иметь идентификатор в качестве аргумента URL. Здесь пользователь не будет выбирать место. В моем вопросе просто посмотрите общий вид на основе класса 03.09.2012

Ответы:


1

Затем вам нужно передать объект Place в форму Restaurant. Проверка формы не имеет доступа к этим вещам, определенным в представлении, если вы явно не передадите эти данные.

class MyForm(forms.ModelForm):
    class Meta:
         model = Restaurant

    def __init__(self, *args, **kwargs):
        self.place = kwargs.pop('place', None)
        super(MyForm, self).__init__(*args, **kwargs

    def clean_related_field(self):
        place = self.place
        try:
            place.restaurant
        except Restaurant.DoesNotExist:
            return place
        raise forms.ValidationError("Restaurant already exists for that book")


class MyView(...):
    form_class = MyForm

    def get_form_kwargs(self):
        kwargs = super(MyView, self).get_form_kwargs()
        kwargs['place'] = Place.objects.get(id=self.kwargs['pk'])
        return kwargs

{% if form.related_field.errors %}.........{% endif %}

Другой подход состоит в том, чтобы подделать проверку в form_valid(), установить словарь ошибок и вернуть ответ. Этот метод может быть предпочтительнее, поскольку он гораздо более ограничен. Кроме того, особенно если вы все равно не используете поле формы, вы можете также добавить флаг ошибки в контекст.

class MyView():
    def form_valid(self, form):
        if Restaurant.objects.filter(related_field=self.get_place()):
            ctx = self.get_context_data(form=form)
            ctx['massive_error'] = True
            return self.render_to_response(ctx)
02.09.2012
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..