Конфигурация обязательных и необязательных полей формы Django

Я нахожусь в середине проекта. У меня есть модель :-

                class CustomersModels(models.Model):
                def servChoices(servs):
                    lst = [x.serv_name for x in servs]
                    ch =()
                    for a in lst:
                        ch += (a,a),
                    return ch

                customer_name = models.CharField(max_length=100)
                comp_name = models.CharField(max_length=100)
                ph_no = models.CharField(max_length=12)
                webs_name = models.URLField(max_length=200)
                service_insterested = models.OneToOneField(ServiceModel, on_delete = models.CASCADE)

                def __str__(self):
                    return self.customer_name

У меня есть соответствующая форма для этой модели. Теперь я хочу, чтобы поля customer_name, comp_name, webs_name должны быть необязательными на одной странице. И обязательными на другой странице. Пожалуйста, подскажите мне, как решить эту задачу наиболее удобным способом

Удалено в 'def servChoices', service_insterested, потому что у меня нет доступа к ним в модели. Я также сделал так, чтобы он возвращал строку с именем класса return 'CustomersModels', чтобы можно было редактировать, удалять записи с пустыми значениями. Поле класса 'customer_name', 'comp_name' ,'webs_name' установлены в blank=True, чтобы сделать их необязательными.

В NoForm обязательным полем является 'ph_no'. YesForm требует, чтобы все поля были заполнены. Для этого используется валидатор (clean), который выведет на странице сообщение о том, какое поле не заполнено (форма не будет отправлена, пока все поля не будут заполнены). Вы можете прочитать о clean здесь:

В папке bboard views замените на вашу папку, где у вас лежат шаблоны (это строка template_name = 'bboard/templ_yes.html').

urls.py

urlpatterns = [
    path('yes/', YesCreateView.as_view(), name='yes'),
    path('no/', NoCreateView.as_view(), name='no'),
]

views.py

from django.views.generic.edit import CreateView
from django.urls import reverse_lazy
from .forms import NoForm, YesForm

class NoCreateView(CreateView):
    template_name = 'bboard/templ_no.html'
    form_class = NoForm
    success_url = reverse_lazy('no')

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        return context

class YesCreateView(CreateView):
    template_name = 'bboard/templ_yes.html'
    form_class = YesForm
    success_url = reverse_lazy('yes')

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        return context

forms.py

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

class YesForm(ModelForm):
    class Meta:
        model = CustomersModels
        fields = ('customer_name', 'comp_name', 'ph_no', 'webs_name')

    def clean(self):
        cleaned_data = super().clean()
        customer_name = cleaned_data.get('customer_name')
        comp_name = cleaned_data.get('comp_name')
        webs_name = cleaned_data.get('webs_name')

        if len(customer_name) <= 0 or customer_name == '':
            raise ValidationError(
                "fill in the field customer_name"
            )
        if len(comp_name) <= 0 or comp_name == '':
            raise ValidationError(
                "fill in the field comp_name"
            )
        if len(webs_name) <= 0 or webs_name == '':
            raise ValidationError(
                "fill in the field webs_name"
            )
            
class NoForm(ModelForm):
    class Meta:
        model = CustomersModels
        fields = ('customer_name', 'comp_name', 'ph_no', 'webs_name')

models.py

class CustomersModels(models.Model):
    customer_name = models.CharField(max_length=100, blank=True)
    comp_name = models.CharField(max_length=100, blank=True)
    ph_no = models.CharField(max_length=12)
    webs_name = models.URLField(max_length=200, blank=True)

    def __str__(self):
        return 'CustomersModels'

tepmplate(templ_yes.html)

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

tepmplate(templ_no.html)

<h2>form</h2>
<form method="post" action="{% url 'no'%}">
      {% csrf_token %}
      {{ form.as_p }}
      <input type="submit" value="adding">
</form>
Вернуться на верх