首页 > 解决方案 > 如何访问外键取决于 django 中的当前活动用户

问题描述

模型.py

class Shop(models.model):
   shop_name = models.CharField(max_length=100, blank=True)
   slug = AutoSlugField()
   logo = models.ImageField(upload_to='restaurant_profile', blank=True)
   related_user = models.ForeignKey(User, on_delete=models.CASCADE)

class Product(models.Model):
    name = models.CharField(max_length=200)
    price = models.FloatField()
    slug = models.SlugField()
    created by = models.ForeignKey(Shop, on_delete=models.DO_NOTHING, default="")

表格.py

class AddProductForm(forms.ModelForm):
    name = forms.CharField(widget=TextInput(attrs={
        'class': 'form-control input-md',
        'style': 'width: 100%; display: inline;',
    }), required=True)

    price = forms.CharField(widget=TextInput(attrs={
        'class': 'form-control input-md',
        'style': 'width: 100%; display: inline;',
    }), required=True)
    category = forms.ModelChoiceField(queryset=ProductCategory.objects.all(), widget=Select(attrs={
        'class': 'form-control input-md',
        'style': 'width: 100%; display: inline;',
    }), required=True)
    class Meta:
        model = Product

        fields = [
            'name',
            'price',
            'category',
            'is_published',
            'created_by',
        ]

每个店铺都有一个相关的用户,在创建产品时,Product models 中的 created_by 字段需要填写

created_by =  models.ForeignKey(Shop.filter(related_user = request.user)

从这个表单创建产品时如何分配这个值我正在使用基于类的视图

标签: djangopython-3.x

解决方案


如果您想更改表单created_by中的值(不是在视图中,正如您在评论中提到的那样),您应该将,甚至更好的,传递给表单并在保存之前添加:requestrequest.user

class AddProductForm(forms.ModelForm):
    #...

    fields = [
        'name',
        'price',
        'category',
        'is_published',
        # 'created_by' Remove this
    ]

    def __init__(self, *args, **kwargs):
        self.user = kwargs.pop('user')
        super(UserProfileUpdateForm, self).__init__(*args,**kwargs)

    def save(self, commit=True, *args, **kwargs):
        instance = super().save(commit=False, *args, **kwargs)
        instance.created_by = self.user
        instance.save()
        return instance

最后一步是user在实例化表单时包含在视图中:

视图.py

my_form = AddProductForm(user=request.user)

推荐阅读