изменение формы модели Django после публикации - PullRequest
1 голос
/ 27 сентября 2011

Я хотел бы изменить отправленную пользователем форму для автоматической вставки project_id, но я продолжаю получать сообщение об ошибке, что project_id в модели Employee не может быть нулевым;

Моя модель:

class Project(models.Model):
    name = models.CharField(max_length=100)
    date_started = models.DateTimeField()

class Employee(models.Model):
    name = models.CharField(max_length=200)
    project = models.ForeignKey(Project)

class AddEmployeeForm(ModelForm):
   class Meta:
     model = Employee
     exclude = ('project',)

Мой взгляд:

def emp_add(request, project_id):
 if request.method == 'POST':
    post = request.POST.copy() # make the POST QueryDict mutable
    post('project', project_id)
    form = AddEmployeeForm(post)
    if form.is_valid():
        saved = form.save()

Ответы [ 3 ]

4 голосов
/ 27 сентября 2011

Как это?

if form.is_valid():
    employee = form.save(commit=False)
    employee.project = Project.objects.get(pk=project_id)
    employee.save()
3 голосов
/ 27 сентября 2011
Ответ * 1000000@maciag.artur, чтобы сохранить с commit=False будет работать. Другой способ - создать экземпляр Employee с требуемым значением project_id и использовать его для создания формы.

Это полезно, если пользовательский метод очистки вашей модели опирается на поле Employee.project.

def emp_add(request, project_id)
    if request.method == 'POST':
        # create a new employee with the given project id
        employee = Employee(project_id) = project_id
        form = AddEmployeeForm(request.POST, instance=employee)
        if form.is_valid():
            saved = form.save()
        <snip>

Для справки см. Примечание ниже Использование подмножества полей в форме в Django документах.

1 голос
/ 27 сентября 2011

Добавить идентификатор проекта в форму в качестве скрытого ввода. Когда запрос возвращается как POST, он будет существовать в объекте POST из формы.

def emp_add(request, project_id):
 if request.method == 'POST':
    post = request.POST.copy() # make the POST QueryDict mutable
    post('project', project_id)
    form = AddEmployeeForm(post)
    if form.is_valid():
        saved = form.save()
 else:
    form = AddEmployeeForm(initial={'project_id':'my_id_value'})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...