Как я могу отобразить значения db строки в форме, прежде чем обновлять форму? - PullRequest
0 голосов
/ 05 июля 2019

Я пытаюсь отобразить данные о сотрудниках после фильтрации базы данных по pk, которую я передал через URL.

Я могу обновить форму, хотя я не хочу, чтобы поля формы были пустыми, посколькуЯ просто хочу обновить, что означает, что это не все поля, которые я собираюсь коснуться

forms.py

class AddEmployeeForm(forms.Form):

    genderset = [(0,'--Select an Option--'),('Male','Male'), ('Female', 'Female')]
    marital_status_set = [(0,'--Select an Option--'),('Married','Married'), ('Single', 'Single')]
    employment_type_set =  [(0,'--Select an Option--'),('Contract','Contract'), ('Full-Time', 'Full-Time'),('Intern', 'Intern')]
    employment_status_set =  [(0,'--Select an Option--'),('Active','Active'), ('Inactive', 'Inactive')]


    first_name = forms.CharField(label = "First Name ", max_length = 200)
    last_name = forms.CharField(label = "Last Name ", max_length = 200)
    employee_id = forms.IntegerField()
    email = forms.EmailField(label = "Email ", max_length = 200)
    address = forms.CharField(label = "Address", max_length = 200)
    role = forms.CharField( max_length = 200)
    date_of_birth = forms.DateField()
    join_date = forms.DateField()
    end_date = forms.DateField()
    location = forms.CharField( max_length = 200)
    hod  = forms.ModelChoiceField(queryset=Department.objects.only('lead'))
    phone_number = forms.CharField( max_length = 200)
    employment_type = forms.ChoiceField( choices = employment_type_set)
    employment_status = forms.ChoiceField( choices = employment_status_set  )
    marital_status = forms.ChoiceField( choices = marital_status_set )
    gender = forms.ChoiceField( choices = genderset )

    department = forms.ModelChoiceField(queryset=Department.objects.only('dept_name'))
    credentials = forms.FileField()
    passport = forms.FileField()
    date_added = forms.DateTimeField( initial = datetime.now, widget=forms.HiddenInput())


views.py

@login_required(login_url='/accounts/login')
def edit(request, pk):
    employee = Employee.objects.filter(pk=pk)
    form = AddEmployeeForm()
    context = {
        'employee': employee,
        'form':form
    }


    return render(request, 'employees/edit.html', context)

edit.html


{% extends 'base.html' %}
{% load crispy_forms_tags %}


{% block content %}

    <div class="page-wrapper">
        <div class="content container-fluid">
            <div class="row">
                <div class="col-xs-4">
                    <h4 class="page-title">Edit Employee Details</h4>
                </div>
                <div class="col-xs-4 text-center">
                    {% include "partials/_alerts.html" %}
                </div>
            </div>
            <form class="m-b-30" action="{% url 'add' %}" method="post" enctype="multipart/form-data">
                    {% csrf_token %}
                    <div class="row"></div>
                    {% for field in form %}

                        <div class="col-sm-6">
                            <div class="form-group">

                                {{ field.errors }}
                                {{ field|as_crispy_field }}
                                {% if field.help_text %}
                                <p class="help">{{ field.help_text|safe }}</p>
                                {% endif %}
                            </div>
                        </div>
                        {% endfor %}
                    </div>

                    <div class="m-t-20 text-center">
                        <button class="btn btn-primary">Save Changes</button>
                    </div>
            </form>
        </div>
    </div>

{% endblock content %}

Он предназначен для отображения значений сотрудника, отфильтрованных из базы данных с использованием значения PK

Ответы [ 2 ]

1 голос
/ 05 июля 2019

В views.py вы можете передать словарь в AddEmployeeForm конструктор для отображения значений:

@login_required(login_url='/accounts/login')
def edit(request, pk):
    employee = Employee.objects.filter(pk=pk)
    field_values = { 'first_name': employee.first_name } #...other fields
    form = AddEmployeeForm(field_values)
    context = {
        'employee': employee,
        'form':form
}
return render(request, 'employees/edit.html', context)

Экземпляр формы либо связан с набором данных, либо не связан.

Если он связан с набором данных, он способен проверять эти данные и отображать форму в виде HTML с данными, отображаемыми в HTML.

Если он не связан, он не может выполнить проверку (потому что нет данных для проверки!), Но он все равно может отобразить пустую форму в виде HTML.

Ссылка https://docs.djangoproject.com/en/2.2/ref/forms/api/#ref-forms-api-bound-unbound

0 голосов
/ 05 июля 2019

Вы можете создать экземпляр формы и использовать этот формат:

form = In_Form(initial={'username': name})

И тогда в своем шаблоне вы можете заполнить форму, используя:

{{employee.name}}
...