2010-03-02 79 views
3

我想在我的一个表单中填充两个外键字段。代码的相关位如下:初始化外键丢失

if request.method == 'POST': 
    form = IssuesForm(request.POST or None) 
    if request.method == 'POST' and form.is_valid(): 
     form.save() 
else: 
    form = IssuesForm(initial={'vehicle': stock_number, 'addedBy': request.user, }) 

vehicle指向Vehicle类。 addedBy是包含当前登录的用户。

然而,下拉菜单不被初始化,因为我想......我还是要选择车辆和用户。从这我有两个问题:

  1. 可能是什么问题?
  2. 什么是使这些表单为只读的最佳方式?

编辑1IssueForm类看起来像这样至今:

class Issues(models.Model): 
    vehicle = models.ForeignKey(Vehicle) 
    description = models.CharField('Issue Description', max_length=30,) 
    type = models.CharField(max_length=10, default='Other', choices=ISSUE_CHOICES) 
    status = models.CharField(max_length=12, default='Pending', 
    choices=ISSUE_STATUS_CHOICES) 
    priority = models.IntegerField(default='8', editable=False) 
    addedBy = models.ForeignKey(User, related_name='added_by') 
    assignedTo = models.CharField(max_length=30, default='Unassigned') 
    dateTimeAdded = models.DateTimeField('Added On', default=datetime.today, 
    editable=False) 
    def __unicode__(self):  
    return self.description 

Form类

class IssuesForm(ModelForm): 
    class Meta: 
    model = Issues 
    exclude = ('assignedTo') 
+0

你能不能展示你的'IssuesForm'类? – 2010-03-02 18:15:07

+0

@ Ben我已添加类 – Stephen 2010-03-02 18:34:41

+0

您应该尝试传入其他字段之一的初始数据,例如描述。如果人口稠密,我会想象这个问题源于车辆的PK,而不是车辆物体本身。 – Adam 2010-03-02 18:37:21

回答

1

关于第二个问题,你想使addedBy场读-只要?如果是这样,请不要将它添加到表单中(如果将其呈现给用户,它将永远不会是只读的,例如Firebug)。您可以将其填充到保存方法中。

if request.method == 'POST': 
    form = IssuesForm(request.POST or None) 
    if request.method == 'POST' and form.is_valid(): 
     issue = form.save(commit=False) 
     issue.addedBy = request.user 
     # any other read only data goes here 
     issue.save() 
else: 
    form = IssuesForm(initial={'vehicle': stock_number}) # this is related to your first question, which I'm not sure about until seeing the form code 
+0

我的想法是,“车辆”:stock_number将initalize车辆外键进入 – Stephen 2010-03-02 18:35:48

+0

太多的检查request.method,如果你用(request.POST或None)初始化表单,然后你需要做的就是检查is_valid(),因为unbound表单(在POST为None的情况下)没有错误 – 2010-03-02 23:23:26

+0

@ Dmitry:我刚才看到了很多检查。 ..我正在从一个旧的应用程序,我已经做了相同的功能代码... thnx通知 – Stephen 2010-03-03 08:10:16

0

为只读形式:在你的窗体类,覆盖__init__method禁用HTML字段:

def __init__(self, *args, **kwargs): 
    super(IssuesForm, self).__init__(*args, **kwargs) 
    for key in self.fields.keys(): 
     self.fields[key].widget.attrs = {'disabled': 'disabled'} 

确保你也别听POST请求,如果是这样,不要不保存表格。 您可以进一步自定义__init__方法以获取一些参数,并在超级方法被调用后将字段设置为这些值。