Home > Mobile >  Django form fields required and optional configuration
Django form fields required and optional configuration

Time:10-03

I am in a middle of a project. I have a model :-

                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

I have a corresponding form for this model. Now what i want is the fields customer_name, comp_name, webs_name to be optional in one page. And required in another page. Please guide me to establish the task in the most convenient manner

CodePudding user response:

Deleted in 'def servChoices', service_insterested because I don't have access to them in the model. I also made it to return a string with the name of the class return 'CustomersModels', so that you can edit, delete records with empty values. The field class 'customer_name', 'comp_name' ,'webs_name' are set to blank=True to make them optional.

In the NoForm, the required field is 'ph_no'. YesForm requires all fields to be filled in. For this, a validator (clean) is used, which will display a message on the page which field is not filled in (the form will not be sent until all fields are filled). You can read about clean here:

In the bboard views, replace with your folder where you have the templates (this is the string 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>
  • Related