Как сделать одно поле формы обязательным для выбора или заполнения другого поля в форме модели django

я создаю где одно поле формы зависит от другого значит только когда одна форма заполнена тогда только он может выбрать или заполнить другое поле формы той же модели в django

from multiselectfield import MultiSelectField
class student(models.Model):
    lunch_choice = [ 
        ('Sandwich', 'Sandwich'),
        ('Salad', 'Salad'),
        ('omlete', 'omlete'),
    ]
    name = models.CharField(max_length=70, blank=False)
    class =  models.CharField(max_length70, blank=True)
    lunch =  multiselectfield(choices=lunch_choice, blank=True)

    def __str__(self):
        return self.name

Я использую эту модель в качестве формы, что я хочу, если пользователь хочет отправить форму и хочет выбрать варианты из обеда, он должен заполнить поле класса, иначе он не сможет отправить форму, или он должен оставить оба поля, а затем отправить форму. любые идеи и предложения будут оценены по достоинству Я хочу, чтобы поле класса было заполнено для выбора из обеда в поле multiselect

Я сделал это без использования MultiSelectField, потому что не знаю, как это сделать с ним. Использовал "чистый" пример, взятый из здесь. Если 'classs' не будет заполнен во время отправки, то произойдет ValidationError с выводом на экран и форма не будет отправлена. Также добавлена проверка 'lunch' на пустое значение. Вы можете не комментировать тройные кавычки в 'def clean' и посмотреть, как это работает без них.

По коду: создается модель 'student'. На ее основе в файле forms.py создается класс MyForm. Шаблон(tam_form.html) и класс формы передаются в класс представления(MyFormCreateView).

Мое приложение называется bboard, поэтому путь к шаблону выглядит так: template_name = 'bboard/tam_form.html' вы должны заменить 'bboard' на свой собственный.

success_url = reverse_lazy('adding'), где мы возвращаем результат, в данном случае в том же виде.

urls.py

from django.urls import path
from .views import *

urlpatterns = [
    path('adding/', MyFormCreateView.as_view(), name='adding'),
]

templates(tam_form.html)

<h2>form</h2>
<form method="post">
      {% csrf_token %}
      {{ form.as_p }}
      <input type="submit" value="adding">
</form>

models.py

from django.db import models

class student(models.Model):
    lunch_choice = [
        ('Sandwich', 'Sandwich'),
        ('Salad', 'Salad'),
        ('omlete', 'omlete'),
    ]
    name = models.CharField(max_length=70, blank=False)
    classs =  models.CharField(max_length=70, blank=True)
    lunch =  models.CharField(max_length=30, choices=lunch_choice, blank=True)

    def __str__(self):
        return self.name

forms.py

from django.forms import ModelForm
from django import forms
from .models import student
from django.core.exceptions import ValidationError

class MyForm(ModelForm):
    class Meta:
        model = student
        fields = ('name', 'classs', 'lunch')

    #"""
    def clean(self):
        cleaned_data = super().clean()
        classs = cleaned_data.get("classs")
        lunch = cleaned_data.get("lunch")

        if classs:
            print('classs field is filled')
        else:
            raise ValidationError(
                    "fill in the field classs"
                )
        if lunch == '':
            raise ValidationError(
                "fill in lunch"
            )
    #"""

views.py

from django.views.generic.edit import CreateView
from django.urls import reverse_lazy
from .forms import MyForm

class MyFormCreateView(CreateView):
    template_name = 'bboard/tam_form.html'
    form_class = MyForm
    success_url = reverse_lazy('adding')

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        return context
Вернуться на верх