如何在ModelForm中获取当前用户类别?

问题描述 投票:0回答:1

有单词学习应用程序。当前用户使用一组单词创建自己的类别。 这个想法是为当前用户自定义选择表单中的选项列表。

模型.py

class ModelWords(models.Model):
    class Meta:
        verbose_name = 'Words'
        verbose_name_plural = 'Words'
    your_language_name = models.CharField(max_length=40)
    eng_name = models.CharField(max_length=40)
    cat = models.ForeignKey('ModelCatsWords', on_delete=models.CASCADE, null=True)
    author = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE)
    def __str__(self):
        return self.your_language_name

class ModelCatsWords(models.Model):
    class Meta:
        verbose_name = 'Categories'
        verbose_name_plural = 'Categories'
    name = models.CharField(max_length=100, db_index=True)
    author = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE)
    def __str__(self):
        return self.name
    def get_absolute_url(self):
        return reverse('category', kwargs={'cat_id': self.pk})

有两种形式。第一个表单添加单词,有一个用户类别列表可供选择,另一个表单添加类别。

表格.py

class WordsFrom(forms.ModelForm):
    cat = forms.ChoiceField(choices=[], required=False, label="select cat")
    def __init__(self, *args, **kwargs):
        self.request = kwargs.pop('request', None)
        super(WordsFrom, self).__init__(*args, **kwargs)
        self.fields['cat'].choices = ModelCatsWords.objects.filter(author=self.request.user.id).values_list('name')
        for visible in self.visible_fields():
            visible.field.widget.attrs['placeholder'] = visible.field.label
    class Meta:
        model = ModelWords
        fields =  ['your_language_name', 'eng_name','cat']
        labels = {
            'your_language_name' : 'word on your language',
            'eng_name' : 'word on english',
            'cat' : 'categorie'
        }

class ModelCatsWordsForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['name'].widget.attrs['placeholder'] = 'categorie'
    class Meta:
        model = ModelCatsWords
        fields = ['name']
        labels = {
            'name': 'Categorie'
        }

有views.py

class WordsFormView(View):

    def get(self,request):
        form_for_word = WordsFrom(request=request)
        form_for_categorie = ModelCatsWordsForm()

        return render(request,'app/appendwords.html',context={'form':form_for_word,'form_for_categorie':form_for_categorie})

请帮助一些代码示例

django django-models django-views django-forms
1个回答
0
投票

你已经可以在views.py中使用这个逻辑了

‘’’ 单词形式 = WordsFrom()

如果 self.request.user.is_authenticated: wordsform.fields['cat'].queryset = ModelCatsWords.objects.filter(author_id=self.request.user.id) '''

© www.soinside.com 2019 - 2024. All rights reserved.