Django 初始化外键下拉列表

Django 初始化外键下拉列表,django,forms,initialization,Django,Forms,Initialization,我想在我的一个表单中填充两个外键字段。相关代码位如下所示: 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': r

我想在我的一个表单中填充两个外键字段。相关代码位如下所示:

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, })
车辆
指向
车辆
类别<代码>由添加以包含当前登录的用户

但是,下拉列表没有按我所希望的那样初始化…我仍然必须选择车辆和用户。由此,我有两个问题:

  • 有什么问题吗
  • 使这些表单只读的最佳方法是什么
  • 编辑1 到目前为止,
    IssueForm
    类如下所示:

    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
    
    形式类

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

    对于第二个问题,是否要将addedBy字段设置为只读?如果是这样,不要将其添加到表单中(如果您将其呈现给用户,它将永远不会是只读的,例如Firebug)。您可以在save方法中填充它

    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
    

    要使窗体成为只读:在窗体类上,覆盖_init__方法以禁用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请求,如果是,请不要保存表单。
    您可以进一步自定义uuu init_uuu方法,以便在调用super方法后获取一些参数并将字段设置为这些值。

    能否也显示您的
    IssuesForm
    类?您应该尝试为其他字段之一传递初始数据,例如description。如果它被填充,我可以想象问题源于通过车辆的pk,而不是车辆对象本身。您添加了模型,不是表单类。@Dmitry:我的错…对不起…我昨天有点困惑:)我在想“车辆”:库存号会初始化车辆外键条目request.method检查太多,如果您使用(request.POST或None)初始化表单,那么您需要做的就是检查是否有效(),因为未绑定表单(如果POST为None)没有错误@Dmitry:我只是看到了很多检查…我正在浏览我为同一功能制作的旧应用程序的代码…通知的thnx是的,我甚至没有注意到多方法检查。