django - 如何限制表单页面中的外键选择?

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

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

群体模型

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'}),
        }

最佳答案

如果您能够发布上述表单的 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 文件中引用。我假设您在下面的示例中使用基于函数的 View -

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)

如果上述内容有帮助,请在评论中告诉我。

关于django - 如何限制表单页面中的外键选择?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66986085/

相关文章:

django - 如何在 Windows 上停止 Django 开发服务器

python - 使用 Django 通过 gmail 发送电子邮件时出现 ConnectionRefusedError

django - 如何在没有 read_only=True 的情况下在 django rest 框架中使用 Foreign_Key 值而不是 id

django - 在 Django 中监控 celery 任务

python - Django 错误 TypeError at/admin/'set' 对象不可逆

django - django 中 SITE_ID 设置的用途是什么?

django - 在 Django 部署中维护内容类型 pk 完整性

python - django - 来自 CharField 的具有默认参数的自定义字段

Django Rest Framework JSON 序列化程序字段无法通过 required=False 验证且没有默认值?