Должна ли форма для добавления данных содержать все поля models.py для возможности сохранения?
У меня вопрос: у меня есть модель "Clientes" внутри приложения с таким же названием, прямо там у меня есть форма со всеми полями моей модели, форма сохраняется достаточно хорошо. У меня также есть приложение под названием "Presupuestos", которое наследует "Clientes", это приложение служит ярлыком для "Clientes". То есть этот ярлык является сокращенной версией формы "Clientes", я имею в виду, что "clientes-add.html" (форма) имеет 10 полей, а в "presupuestos-add.html" (форма) - 5 полей. Проблема в том, что форма "Presupuestos" ничего не сохраняет. Может ли это быть потому, что он не вызывает все поля "Clientes" и сохраняет только 5? Также пробовал вставлять ошибки формы, но не получается
models.py
class Clientes(models.Model):
tipo = models.CharField(max_length=200)
TITLE = (
('Mrs.', 'Mrs.'),
('Miss', 'Miss'),
('Mr.', 'Mr.'),
)
corporacion=models.CharField(max_length=200)
titulo = models.CharField(max_length=200, null=True, choices=TITLE,default='Mr.')
nombre = models.CharField(max_length=200)
apellido = models.CharField(max_length=200)
telefono = models.IntegerField()
tel = models.IntegerField()
fax = models.IntegerField()
correo = models.EmailField(max_length=200)
website=models.URLField(max_length=200)
pais = models.CharField(max_length=200)
direccion=models.CharField(max_length=200)
ciudad=models.CharField(max_length=255)
estado=models.CharField(max_length=255)
zip=models.CharField(max_length=255)
fecha_registro = models.DateTimeField(default=datetime.now)
def __str__(self):
return f'{self.nombre} {self.apellido}'
views.py
class step1(CreateView):
model=Clientes
form_class = ClientesForm
template_name='Presupuestos/new-estimate-1-customer-details.html'
success_url=reverse_lazy('Presupuestos:step2')
presupuestos-add.html
<form method="post">
{% csrf_token %}
<div class="row">
<div class="col-12 mb-3">
<h4 class="card-title">Customer information</h4>
</div>
<div class="col-md-2">
<div class="mb-3">
<label>Title</label>
{{ form.titulo }}
</div>
</div>
<div class="col-md-5">
<div class="mb-3">
<label>First name</label>
{{form.nombre}}
</div>
</div>
<div class="col-md-5">
<div class="mb-3">
<label>Last name</label>
{{form.apellido}}
</div>
</div>
<a href="{% url 'Presupuestos:step2' %}"> <button class="btn btn-primary" type="submit" value="Submit">Next</button></a>
</div>
</form>
Что касается clients-add.html, он отлично работает, сохраняя данные, единственная разница с quotes-add.html в том, что clients-add.html имеет все поля models.py
В классе Meta вашей формы вы можете включить или исключить любые поля, какие пожелаете.
Например:
ClientesForm(models.Form):
...
class Meta:
model = Clientes
fields = ['corporation', 'titulo']
будет включать только два перечисленных поля.
Аналогичным образом можно исключить поля из формы таким образом, что все поля, кроме перечисленных, будут включены в форму.
ClientesForm(models.Form):
...
class Meta:
model = Clientes
exclude = ['corporation', 'titulo']
Ваша проблема в том, что каждое ваше поле является обязательным (ни в одном из полей вашей модели нет null=True), поэтому если форма включает это поле, то ожидается, что для него будет указано значение. По умолчанию форма модели включает все поля, если вы не определите массив fields или массив exclude.