Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在Django模型表单中引用当前对象?_Python_Django - Fatal编程技术网

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

Python 如何在Django模型表单中引用当前对象?,python,django,Python,Django,我有两个相关的型号,公司和包装。每个公司可以有几个包,但只有一个默认的_包。以下是模型: class Company(models.Model): default_package = models.OneToOneField( Package, blank=True, null=True, related_name='default_for_%(class)s') 至于包装 我正试图为该公司制作一个通用的CreateVie

我有两个相关的型号,公司和包装。每个公司可以有几个包,但只有一个默认的_包。以下是模型:

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

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

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
def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)
    self.fields['default_package'].queryset = Package.objects.filter(company=self.instance)
公司形式类似于以下内容:

class CompanyForm(forms.ModelForm):
    class Meta:
        model = Company
        fields = [
            'name',
            'default_package',
        ]
问题是,在这种形式中,默认的包下拉菜单显示所有包,而我希望它显示正在考虑的公司包集中的包,类似于在视图的get\u context\u data方法中引用self.object所做的

本质上,我想在公司形式中做一些类似的事情:


但是,这是不可能的,因为在这个级别上没有定义self。是否有某种模型形式的方法,如get_queryset for a specific field,在其中我可以使用self.instance定义queryset?

我通过更新模型形式的uuu init_uuu中的字段来实现这一点,如下所示:

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
def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)
    self.fields['default_package'].queryset = Package.objects.filter(company=self.instance)

你试过了吗?根据,ModelFormMixin的get_form_kwargs添加了self.object。您可能只需要执行self.instance.package_set。