Как сделать одно поле формы обязательным для выбора или заполнения другого поля в форме модели 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