【问题标题】:how to limit foreign key choices in the form page?如何限制表单页面中的外键选择?
【发布时间】:2021-07-03 06:24:01
【问题描述】:

以下是我的模型,我只想以帖子形式显示用户加入的那些组。 示例:如果我加入了“mcu”组,那么应该只显示那个组,我应该怎么做?

组模型

class Group(models.Model):
    name = models.CharField(max_length=200, unique=True)
    description = models.TextField(blank=True, default='')
    members = models.ManyToManyField(User, through='GroupMember')


class GroupMember(models.Model):
    group = models.ForeignKey(Group, related_name='memberships',on_delete=models.CASCADE)
    user = models.ForeignKey(User, related_name='user_groups',on_delete=models.CASCADE)

    class Meta:
        unique_together = ('group', 'user')

后模型

User = get_user_model()

class Post(models.Model):
    user = models.ForeignKey(User, related_name='posts',on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now=True)
    title = models.CharField(max_length=250,default='')
    message = RichTextField()
    group = models.ForeignKey(Group, related_name='posts', null=True, blank=True,on_delete=models.CASCADE)


    class Meta:
        ordering = ['-created_at']
        unique_together = ['user', 'message']

在views.py中

class CreatePost(LoginRequiredMixin, SelectRelatedMixin, generic.CreateView):
    model = models.Post
    form_class = forms.PostForm

    def form_valid(self, form):
        self.object = form.save(commit=False)
        self.object.user = self.request.user
        self.object.save()
        return super().form_valid(form)

在forms.py中

class PostForm(forms.ModelForm):
    class Meta:
        model = models.Post
        fields = ('title', 'message', 'group')
        widgets = {
            'message': forms.Textarea(attrs={'class': 'form-control mb-3'}),
            'title': forms.TextInput(attrs={'class': 'form-control mb-3'}),
            'group': forms.Select(attrs={'class': 'form-control'}),
        }

【问题讨论】:

  • 请在问题中添加您需要的视图和表单类。
  • 请在问题中添加forms.py文件。
  • @AbdulAzizBarkat,@FA,我已经更新了问题

标签: django django-models django-rest-framework django-views django-forms


【解决方案1】:

如果您发布了上述表单的views.py 和创建表单的forms.py,那就太好了。

如果没有看到上述两个文件,您需要执行以下操作。

在您的 forms.py 文件中,您将拥有如下类似的表单。添加逻辑需要添加def __init__

forms.py 文件示例-

from django import forms
from django.forms import ModelForm

class PostForm(ModelForm):
    class Meta:
        model = Post
        fields = ['title', 'message', 'group']

    def __init__(self, bundle_seller, *args, **kwargs):
        super(PostForm, self).__init__(*args, **kwargs)
        self.fields['group'].queryset = Group.objects.all().filter(members=loggedin_user)

您在上面最后一行引用的引用loggedin_user 需要在帖子的views.py 文件中引用。我假设您在下面的示例中使用基于函数的视图-

def new_post(request):
    ....
    loggedin_user = request.user
    form = PostForm(data=request.POST or None, loggedin_user=loggedin_user)
    if request.method == 'POST':
        ....
    else:
        form = PostForm(loggedin_user=loggedin_user)

如果上述方法有帮助,请在 cmets 中告诉我。

【讨论】:

  • 我已经更新了问题,请再次检查问题
  • forms.py的init函数中的“bundle_seller”是什么,forms.py中的self.fields['group'].queryset是什么
猜你喜欢
  • 2010-12-21
  • 1970-01-01
  • 2010-12-16
  • 2013-06-25
  • 1970-01-01
  • 2012-04-02
  • 1970-01-01
  • 2015-11-08
  • 1970-01-01
相关资源
最近更新 更多