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>
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
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
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 %}
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>
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
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
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 %}