1

我正在开发一个 DIY 应用程序(Django 1.5),但遇到了障碍。涉及的主要模型有GuideToolItemStep。一个指南可以有许多工具和项目,一个工具或项目可以属于许多指南。一个步骤也是如此——它可以有许多工具和项目,一个工具或项目可以属于许多步骤。一个指南有许多步骤,一个步骤属于一个指南。

引导多对多项目

引导多对多工具

指导一对多步骤

步进多对多项目

步进多对多工具

路障...

在指南级别,我希望工具和项目选项是无限的。但在步骤级别,我希望将工具和项目选项限制为分配给它所属的指南的选项。基本上,在创建/编辑步骤时,我想列出通过指南可用的所有工具和项目的复选框。用户选择当前步骤所需的那些。每个步骤都有不同的工具和项目组合(因此需要复选框)。

我发现了ModelMultipleChoiceFieldStep 的 ModelForm 类。在那里我可以指定一个查询集。 但是,如何访问 Guide 模型的实例以检索其工具和项目,以便我可以正确构建选择? 我想提供类似于您在视图中所做的查询...

Guide.objects.get(pk=n).tools.all()
Guide.objects.get(pk=n).items.all()

我怎样才能做到这一点ModelMultipleChoiceField?我希望我能够清楚地解释这一点。

提前感谢您的帮助。

class Tool(models.Model):
    name = models.CharField(max_length=100)
    ...


class Item(models.Model):
    name = models.CharField(max_length=100)
    ...


class Guide(models.Model):
    models.CharField(max_length=100)
    description = models.CharField(max_length=500)
    tools = models.ManyToManyField(Tool, null=True, blank=True)
    items = models.ManyToManyField(Item, null=True, blank=True)
    ...


class Step(models.Model):
    title = models.CharField(max_length=100)
    body = models.TextField()
    guide = models.ForeignKey(Guide)
    tools = models.ManyToManyField(Tool, null=True, blank=True)
    items = models.ManyToManyField(Item, null=True, blank=True)

编辑:5/2 进一步阅读后,看起来我必须重写 的__init__方法ModelMultipleChoiceField,我在其中获得对 的引用self.instance,从而允许我创建查询,例如,self.instance.guide.tools.all()self.instance.guide.items.all()。然后通过创建字段fields['field_name']

我现在在工作,所以我要等到今晚晚些时候才能试一试。我会报告我的发现。

4

1 回答 1

1

我最终做的是以下。我在我的 ModelForm 类中定义了一个方法来创建ModelMultipleChoiceField. 原因是在请求创建步骤页面时,没有与该步骤关联的指南,直到您保存(POST...假设验证成功)。但我确实可以访问将为其创建步骤的指南的 slug 字段。我从 URL 中得到。slug 字段在我的应用程序中是独一无二的。所以我通过我创建的新方法将 slug 从我的视图传递到表单。从那里,我可以获取分配给指南的工具,并在我的模板中的表单上提供这些选项。

表格.py

class NewStepForm(forms.ModelForm):
    ...
    def create_tools_field(self, slug):
        self.fields['tools'] = forms.ModelMultipleChoiceField(
            queryset=Guide.objects.get(slug=slug).tools.all(),
            widget=forms.CheckboxSelectMultiple(attrs={'class': 'unstyled'})
        )
    ...

视图.py

class NewStepView(View):

    form_class = NewStepForm
    initial = {'key': 'value'}
    template_name = "guides/guide_step_new.html"

    @method_decorator(login_required)
    def dispatch(self, *args, **kwargs):
        return super(NewStepView, self).dispatch(*args, **kwargs)

    def get(self, request, *args, **kwargs):
        slug = kwargs.get('slug')
        form = self.form_class(initial=self.initial)
        form.create_tools_field(slug)
        return render(request,  self.template_name, {'form': form})
于 2013-05-07T00:12:51.760 回答