如何在Django模型表单中引用当前对象?

2024-09-28 22:04:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个相关的模型,Company和{}。每个公司可以有多个软件包,但只有一个default_package。以下是模型:

class Company(models.Model):
    default_package = models.OneToOneField(
        Package,
        blank=True,
        null=True,
        related_name='default_for_%(class)s')

对于Package

^{pr2}$

我试图为公司制作一个通用的CreateView和{},如下所示:

class EditViewsMixin(DashboardAccessMixin, SuccessMessageMixin):
    model = Company
    success_url = reverse_lazy('dashboard:companies')
    form_class = CompanyForm


class CompanyCreate(EditViewsMixin, CreateView):
    template_name = 'companies/new.html'
    success_message = "Company '%(name)s' was created successfully"


class CompanyUpdate(EditViewsMixin, UpdateView):
    template_name = 'companies/edit.html'
    success_message = "Company '%(name)s' was updated successfully"

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['packages'] = self.object.package_set.order_by('name')
        return context

CompanyForm类似于以下内容:

class CompanyForm(forms.ModelForm):
    class Meta:
        model = Company
        fields = [
            'name',
            'default_package',
        ]

问题是,在这个表单中,default_package下拉菜单显示所有的包,而我希望它显示在考虑中的公司的package_set中的包,类似于通过引用视图的get_context_data方法中的self.object。在

本质上,我想在CompanyForm中做这样的事情:

default_package = forms.ModelChoiceField(
    queryset=Package.objects.filter(company=self.instance)
)

但是,这是不可能的,因为self没有在这个级别定义。对于一个特定的字段,有没有一种类似于ModelForm的方法,在这种方法中,我可以使用self.instance来定义查询集?在


Tags: nameselfdefaultpackagedatagetcontext公司
1条回答
网友
1楼 · 发布于 2024-09-28 22:04:09

我通过如下更新ModelForm's__init__()中的字段来做到这一点:

def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)
    self.fields['default_package'].queryset = Package.objects.filter(company=self.instance)

相关问题 更多 >