下面是我的模型,我只想以帖子形式显示用户加入的那些组。 示例:如果我加入“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'}),
}
最佳答案
如果您能够发布上述表单的 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/