Начальное значение поля modelform_factory в Django
Это мое первое сообщение на StackOverflow. Я также новичок в использовании Django (на самом деле я использую версию 3.2). Я читал о том, как установить начальное значение поля в форме, используя начальный параметр modelform_factory. Я выполнил несколько примеров кода, но поле не отображает значение. В моем приложении используется плагин crispy_form.
В поле matricula в моей модели я хочу установить значение, которое берется из запроса, получающего общее количество записей в таблице учителей плюс 1.
Когда я загружаю страницу, поле matricula в форме не отображает нужное значение. что я делаю не так?
Спасибо за помощь.
Простите за мой английский. Он не очень хорош. Надеюсь, вы сможете меня понять.
Переведено с помощью www.DeepL.com/Translator (бесплатная версия) Это мой код:
Модель:
class docente(models.Model):
matricula = models.CharField(max_length=10, verbose_name="Matrícula", unique=True)
nombre = models.CharField(max_length=80)
apellidoPaterno = models.CharField(max_length=80, verbose_name=" Apellido Paterno")
apellidoMaterno = models.CharField(max_length=80, verbose_name="Apellido Materno", blank=True) # Campo opcional
direccion = models.CharField(max_length=150, verbose_name="Dirección", blank=True) # Campo opcional
telefono = models.CharField(max_length=13, verbose_name="Teléfono", blank=True) # Campo opcional
email = models.EmailField(verbose_name="Correo Electrónico", blank=True) # Campo opcional
colonia = models.CharField(max_length=150, blank=True) # Campo opcional
comunidad = models.CharField(max_length=150, blank=True) # Campo opcional
fecha_nacimiento = models.DateField(verbose_name="Fecha de Nacimiento", blank=True, null=True) # Campo opcional
estado_civil = models.ForeignKey(estado_civil, verbose_name="Estado Civil", on_delete=models.CASCADE)
profesion_ocupacion = models.CharField(verbose_name="Profesión/Ocupación", max_length=150, blank=True, null=True) # Campo opcional
ultimo_grado_estudios = models.ForeignKey(grado_estudios, verbose_name="Último Grado de Estudios", on_delete=models.CASCADE)
otros_estudios = models.ManyToManyField(otros_estudios, verbose_name="Otros estudios")
def __str__(self):
return self.nombre
Форма:
class FormularioDocente(forms.ModelForm):
class Meta:
model = docente
fields = '__all__'
widgets = {
'matricula': TextInput(attrs={'readonly': 'readonly'})
}
Вид:
def nuevo_docente(request):
mensaje = "Nuevo Docente"
cuantos = docente.objects.count()
cuantos+=1
initial_data = {'matricula':cuantos}
formFormulario = modelform_factory(docente, form=FormularioDocente)
form = formFormulario(request.POST, initial=initial_data)
if request.method=='POST':
if form.is_valid():
form.save()
messages.success(request, MENSAJE_SUCCESS_FORMULARIO)
form = formFormulario() # Limpiar el formulario ya procesado y guardado
else:
messages.error(request, MENSAJE_ERROR_FORMULARIO)
messages.error(request, form.errors)
return render(request, 'escuela/nuevo_form.html', {'mensaje': mensaje, 'form':form})
Шаблон:
{% extends 'escuela/base.html' %}
{%load crispy_forms_tags%}
{% block content %}
<div class="col-md-8 offset-md-2 ">
<h2>{{mensaje}}</h2>
</div>
<div class="main">
{% include 'escuela/messages.html' %}
<form method="POST" class="post-form">
{% csrf_token %}
<table class="table table-borderless table-responsive">
{{form|crispy}}
</table>
<br>
<button type="submit" id="boton-formulario" class="save btn btn-primary">Guardar</button>
</form>
</div>
{% endblock %}
Когда вы передаете request.POST в класс формы, вы фактически говорите data=request.POST, что переопределяет ваши начальные значения. Это происходит потому, что если вы не отправляете форму, то request.POST равен пустому словарю, а данные (даже пустой словарь данных) используются поверх начальных значений.
Чтобы противостоять этому, попробуйте:
form = formFormulario(request.POST or None, initial=initial_data)
Пустой словарь имеет значение Falsey, поэтому здесь вы говорите, что если request.POST является ложным, то data=None. При отсутствии словаря вместо него следует использовать ваши начальные значения.