亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在選擇中排除用戶已經選擇的選項

在選擇中排除用戶已經選擇的選項

aluckdog 2022-07-26 17:08:57
是否可以排除用戶已經選擇并存儲在表中的選項?這是來自models.py的表格class Fruit(models.Model):name = models.CharField(max_length=250, unique=True, blank=False, null=False)sort= models.ForeignKey('FruitSort', on_delete=models.SET_NULL, null=True, blank=False)def __str__(self):    return '%s (%s)' % (self.name, self.sort.name)class UserFruit(models.Model):    Comment = models.CharField(max_length=55)    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)    fruit = models.ForeignKey('Fruit', on_delete=models.CASCADE)    class Meta:        unique_together = (("user", "fruit",),)這是生成我的表單的 forms.py。class UserFruit(forms.ModelForm):class Meta:    model = UserFruit    fields = ('comment', 'fruit')def __init__(self, *args, **kwargs):    super(UserFruit, self).__init__(*args, **kwargs)    for visible in self.visible_fields():        visible.field.widget.attrs['class'] = 'form-control form-style-alt'        self.fields['comment'].widget.attrs['placeholder'] = 'comment'        self.fields['fruit'].empty_label = 'Please, choose fruit'現在views.pyclass Fruit(generic.CreateView):    form_class = UserFruit    template_name = 'fruit.html'    def get(self, request, *args, **kwargs):        form = self.form_class(instance=UserFruit.objects.filter(user=request.user).first())        fruit = UserFruit.objects.filter(user=request.user)        return render(request, self.template_name, {'form': form, 'fruit': fruit})    def post(self, request, *args, **kwargs):        form = self.form_class(request.POST)        if form.is_valid():            post = form.save(commit=False)            post.user = request.user            post.save()        return redirect('fruit')最后是模板。我想排除或禁用用戶已經添加的水果。我似乎沒有找到一個干燥和順利的解決方案。我可以從數據庫中循環并通過 javascript 排除。但是看起來很俗氣。非常感謝您的想法!
查看完整描述

1 回答

?
FFIVE

TA貢獻1797條經驗 獲得超6個贊

是的。例如,您可以將user參數傳遞給表單,并作為Fruit尚未選擇的查詢集選擇,例如:


class UserFruitForm(forms.ModelForm):


    class Meta:

        model = UserFruit

        fields = ('comment', 'fruit')


    def __init__(self, user, *args, **kwargs):

        super(UserFruit, self).__init__(*args, **kwargs)

        for visible in self.visible_fields():

            visible.field.widget.attrs['class'] = 'form-control form-style-alt'

        self.fields['comment'].widget.attrs['placeholder'] = 'comment'

        self.fields['fruit'].empty_label = 'Please, choose fruit'

        self.fields['fruit'].queryset = Fruit.objects.exclude(

            userfruit__user=user

        )

但是,您在CreateView. 您可以簡單地讓 theCreateView完成幾乎所有的工作:


from django.urls import reverse_lazy


class Fruit(generic.CreateView):

    form_class = UserFruitForm

    template_name = 'fruit.html'

    success_url = reverse_lazy('fuit')


    def get_form_kwargs(self):

        kwargs = super().get_form_kwargs()

        kwargs.update(user=self.request.user)

        return kwargs


    def get_context_data(self, *args, **kwargs):

        context = super().get_context_data(*args, **kwargs)

        context.update(fruit=UserFruit.objects.filter(user=self.request.user))

        return context


    def form_valid(self, form):

        form.instance.user = self.request.user

        super().form_valid(form)

請將表格重命名為UserFruitForm. 現在,您在模型和表單之間引入了名稱沖突。通過重命名它,您所指的內容就很清楚了。UserFruitUserFruit


查看完整回答
反對 回復 2022-07-26
  • 1 回答
  • 0 關注
  • 71 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號