Django manyToManyField基于使用Formwizard的另一个对象的初始值

时间:2011-02-25 15:06:30

标签: django many-to-many

我有以下模型:

class DrawingRevision(models.Model):
    revision = models.CharField(max_length = 10)
    previous_revision = models.ForeignKey('self', blank=True, null=True)
    drawing = models.ForeignKey(Drawing)
    part = models.ManyToManyField(Part, blank=True, null=True)

我有一个表单向导,允许用户选择previous_revision。我希望能够在用户到达formWizard的最后一页时选择previous_revision中的部分列表。我的想法是在ModelForm for DrawingRevision中这样做,但我不确定如何去做。

 class DrawingRevisionForm(forms.ModelForm):
    class Meta:
        model = DrawingRevision
        exclude = ('drawing','revision', 'previous_revision',)
    def __init__(self, *args, **kwargs):
        self(DrawingRevisoinForm, self).__init__(*args, **kwargs)
        self.fields['revision_date'].widget = widgets.AdminDateWidget()

感谢您的帮助!

编辑:

我在这方面取得了一些进展。在我的formwizard类中,我定义了以下process_step方法。在我需要显示设置了初始值的manytomany字段之前调用它。下面,'d'是上一张图中的部件列表,nextform应该是要显示的表单(尽管type(self.form_list [1])告诉我它是一个declarativefieldsmetaclass)。我需要做的是将部分列表(d)作为下一页部分字段的初始值。

def process_step(self, request, form, step):                                                                                                                                   
    if step == 1:                                                                                                                                                         
        d = DrawingRevision.objects.filter(id__exact=request.POST['0-prerev'])[0].part.all()                                                                                   
        nextform = self.form_list[1]  

编辑2:  我在这方面取得了一些进展。我认为我需要将DrawingRevision表单的初始成员设置为:

nextform.initial = {'part': [DrawingRevision.objects.filter(id__exact=request.POST['0-prerev'])[0].part.all()], } 

可能在parse_params()中。但是当我这样做时,在最后一个表单上没有选择初始值,而是取消选择所有内容。

1 个答案:

答案 0 :(得分:0)

我在parse_params()中添加了它并且它有效!:

if request.method == 'POST' and current_step == 1:
    form = self.get_form(current_step, request.POST)
        if form.is_valid():
            self.initial[(current_step + 1)] = {'part': DrawingRevision.objects.filter(id__exact=request.POST['0-prerev'])[0].part.all(), }

我希望有人觉得这很有用。