Django form is not displaying all fields

Question:

I have a problem, i need to create form like scheme, i have my models and created forms.py.When i add my forms into the HTML, i have only 2 of all fields in my forms.What it can be?
This is my models.py

class Post(models.Model):
    full_name = models.CharField(max_length=60, verbose_name='Full name'),
    name_scheme = models.CharField(max_length=40, verbose_name='Name of scheme')
    job = models.CharField(max_length=100, verbose_name='Job'),
    email = models.EmailField(verbose_name='Email'),
    domain_name = models.CharField(max_length=100, verbose_name='Domain'),
    phone_number = PhoneNumberField,
    company_name = models.CharField(max_length=30, verbose_name='Company name'),
    text = models.TextField(max_length=255, verbose_name='Text'),
    age = models.IntegerField(validators=[MinValueValidator(18), MaxValueValidator(65)])
    address = models.CharField(max_length=255, verbose_name='Address'),
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.full_name

forms.py

class AddSchemeForm(forms.ModelForm):
    class Meta:
        model = Post
        fields = '__all__'

views.py

def add_scheme(request):
    if request.method == 'POST':
        form = AddSchemeForm(request.POST, request.FILES)
        if form.is_valid():
            form.save()
            return redirect('home')
    else:
        form = AddSchemeForm()
        return render(request, 'add_scheme.html', {'form': form})

template:

<form method="post" enctype="multipart/form-data">
    {% csrf_token %}
    <div>
      {{ form.full_name.label_tag }}
      {{ form.full_name }}
    </div>
    <div>
      {{ form.name_scheme.label_tag }}
      {{ form.name_scheme }}
    </div>
    <div>
      {{ form.job.label_tag }}
      {{ form.job }}
    </div>
Asked By: makim

||

Answers:

The problem is with syntax. The issue is with the comma (,) after each field definition that you used. Commas are used to separate items in a list, so in this case, they are causing each field to be treated as a single-item tuple, which is not what you want.

Here is the model class code you can use:

class Post(models.Model):
    full_name = models.CharField(max_length=60, verbose_name='Full name')
    name_scheme = models.CharField(max_length=40, verbose_name='Name of scheme')
    job = models.CharField(max_length=100, verbose_name='Job')
    email = models.EmailField(verbose_name='Email')
    domain_name = models.CharField(max_length=100, verbose_name='Domain')
    phone_number = PhoneNumberField
    company_name = models.CharField(max_length=30, verbose_name='Company name')
    text = models.TextField(max_length=255, verbose_name='Text')
    age = models.IntegerField(validators=[MinValueValidator(18), MaxValueValidator(65)])
    address = models.CharField(max_length=255, verbose_name='Address')
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.full_name
Answered By: dostogircse171

You can simply use {{form.as_p}} if you want to display all fields. Currently, you are manually displaying two fields.

Also remove extra commas in models so:

class Post(models.Model):
    full_name = models.CharField(max_length=60, verbose_name='Full name')
    name_scheme = models.CharField(max_length=40, verbose_name='Name of scheme')
    job = models.CharField(max_length=100, verbose_name='Job')
    email = models.EmailField(verbose_name='Email')
    domain_name = models.CharField(max_length=100, verbose_name='Domain')
    phone_number = PhoneNumberField()
    company_name = models.CharField(max_length=30, verbose_name='Company name')
    text = models.TextField(max_length=255, verbose_name='Text')
    age = models.IntegerField(validators=[MinValueValidator(18), MaxValueValidator(65)])
    address = models.CharField(max_length=255, verbose_name='Address')
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.full_name
Answered By: Sunderam Dubey

Your model fields seems to have a , in the end. Since they are individual fields, they should be Python statements like this:

class Post(models.Model):
    full_name = models.CharField(max_length=60, verbose_name='Full name')
    name_scheme = models.CharField(max_length=40, verbose_name='Name of scheme')
    job = models.CharField(max_length=100, verbose_name='Job')
    email = models.EmailField(verbose_name='Email')
    domain_name = models.CharField(max_length=100, verbose_name='Domain'),
    phone_number = PhoneNumberField()
    company_name = models.CharField(max_length=30, verbose_name='Company name')
    text = models.TextField(max_length=255, verbose_name='Text')
    age = models.IntegerField(validators=[MinValueValidator(18), MaxValueValidator(65)])
    address = models.CharField(max_length=255, verbose_name='Address')
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.full_name

I also fixed your PhoneNumberField. It wasn’t initialized properly.

You can use it in the template like this:

{% extends 'base.html' %}

{% block content %}
    <h2>Add Scheme</h2>
    <form method="POST" enctype="multipart/form-data">
        {% csrf_token %}
        {{ form.as_p }}
        <button type="submit">Submit</button>
    </form>
{% endblock %}
Answered By: Sanyam Khurana