2011-09-27 140 views
1

我想修改一个用户提交的表单来自动插入project_id,但我不断收到错误,在Employee模型中的project_id不能为null;修改后Django模型表单

我的模型:

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() 
+1

你是指第4行的post ['project'] = project_id'吗? –

回答

4

喜欢这个?

if form.is_valid(): 
    employee = form.save(commit=False) 
    employee.project = Project.objects.get(pk=project_id) 
    employee.save() 
+0

是的,这是有效的。但是,我希望能够将project_id直接添加到表单中,以便我可以调用is_valid()。这样我可以从表单验证例程中受益,而且它可以减少一个数据库调用。 – dubreakkk

1

将项目ID添加到表单中作为隐藏输入。当请求以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'}) 
3

@ maciag.artur的答案,与commit=False保存将工作。另一种方法是实例化具有所需的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文档下方Using a subset of fields on the form注箱。