Начальное значение поля 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. При отсутствии словаря вместо него следует использовать ваши начальные значения.

Вернуться на верх