@Alex228Alex

В Django форме не меняется параметр у виджета. Почему?

Вот мой forms.py, тут моя форма наследует всё от модели, но один виджет у меня не стандартный (Select, а по стандарту у CharField идёт TextInput виджет). Есть функция, которая генерирует значения для него. Всё бы то ничего, только у моего виджета есть параметр choices, который принимает список значений для выбора. И вот этот список по задумке должен меняться в процессе выполнения кода. Но почему-то этого не происходит. Параметр choices как-будто бы принимает значения один раз, и то при запуске сервера, и не хочет их менять в процессе выполнения кода.
Вот все файлы:

# forms.py

from django.forms import ModelForm, TextInput, Select, DateInput
from department.models.employee import Employee
from department.funcional import func


class EmployeeForm(ModelForm):
    class Meta:
        model = Employee
        fields = ['name', 'dep', 'salary', 'position', 'date']
        widgets = {
            "name": TextInput(attrs={
                               'class': 'form-control',
                               'placeholder': 'Enter a name for employee... '
                                }),
            "dep": Select(choices=func.dep_select(), attrs={
                'class': 'form-control',
            }),
            "salary": TextInput(attrs={
                'class': 'form-control',
                'placeholder': 'Enter salary... '
            }),
            "position": TextInput(attrs={
                'class': 'form-control',
                'placeholder': 'Enter position... '
            }),
            "date": DateInput(attrs={
                'class': 'form-control',
                'placeholder': 'Enter a date...'
            }),
        }


# views.py

def employee_add(request):
error = ''
form = EmployeeForm()

if request.method == "POST":
    form = EmployeeForm(request.POST)
    if form.is_valid():
        form.save()
        return redirect('employee_home')
    else:
        error = "Ошибка"


time = datetime.now().date()

data = {
    'form': form,
    'error': error,
    'time': time,
}
return render(request, 'employee/employee_add.html', data)


#models.py

from django.db import models

class Employee(models.Model):

    name = models.CharField('Employee:', max_length=30)
    dep = models.CharField('Department:', max_length=30)
    salary = models.CharField('Salary:', max_length=30)
    position = models.CharField('Position:', max_length=30)
    date = models.DateField('Date:', max_length=30)


А вот функция, генерирующая список. Эта функция из другой модели получает значения и вносит их dep_set. Но почему-то значения не хотят меняться в процессе выполнения кода. Но я только не могу понять, где именно они не меняются, в этой функции или же сам параметр choices принимает их единожды при запуске сервера...
from department.models.department import Department

def dep_select():

    dep_set = []
    department = Department.objects.all()

    for i in department:
        a = (i, i)
        dep_set.append(a)

    return dep_set
  • Вопрос задан
  • 47 просмотров
Решения вопроса 1
@bacon
Да, так и есть dep_select выполняется только при определение класса EmployeeForm. Чтобы изменять dep при создании формы, надо делать это в __init__ этой формы.
Только вот не понятно, почему у тебя dep CharField, а не ForeignKey на Department, тогда бы select создавался автоматически.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы