【发布时间】:2014-02-16 13:39:46
【问题描述】:
不确定是否应该将其拆分为单独的帖子,我基本上必须将整个代码复制粘贴到每个问题中。我希望这很好。
我的应用中有频道。每个用户可以对每个频道具有不同的访问级别。我需要能够查询用户可以阅读的每个频道的条目。我已经实现为ManyToManyField,有没有更好的解决方案?
在我的权限模型中,我有
ForeignKey(User, blank=True, null=True)和unique_together = ("channel", "user")。我使用具有空用户字段的权限对象来存储未指定用户的默认访问级别。这会给我带来麻烦吗? (null!=null 在数据库级别)我想在 ChannelCreateForm 中设置默认访问级别,因此我添加了额外的字段并覆盖了相关视图的 form_valid 方法。有没有更合适的方法来做到这一点?
-
我在这里有点即兴发挥。请指出您在我的代码中发现的任何丑陋之处。这里是:
class Channel(models.Model): name = models.CharField(max_length=30, unique=True) title = models.CharField(max_length=70, blank=True, null=True) description = models.TextField(blank=True, null=True) owner = models.ForeignKey(User) permission = models.ManyToManyField(User, through='ChannelPermission', related_name="permission") class ChannelPermission(models.Model): PERM_CHOICES = ( (0, 'none'), (1, 'read'), (2, 'post'), (3, 'edit'), (4, 'lock'), (5, 'manage'), ) channel = models.ForeignKey(Channel) user = models.ForeignKey(User, blank=True, null=True) access = models.IntegerField( choices=PERM_CHOICES, default=0) class Meta: unique_together = ("channel", "user") class ChannelCreateForm(forms.ModelForm): access = forms.ChoiceField(label = 'Default access', choices = ( (0, 'none'), (1, 'read'), (2, 'post'), (3, 'edit'), ) ) class Meta: model = Channel fields = ['name', 'title', 'access', 'description'] class ChannelCreate(CreateView): form_class = ChannelCreateForm template_name = 'index_form.html' def form_valid(self, form): obj = form.save(commit=False) obj.owner = self.request.user obj.save() perm = ChannelPermission(user=None, channel=obj, access=form.cleaned_data['access']) perm.save() return HttpResponseRedirect(reverse('some_name'))
【问题讨论】:
标签: python django permissions many-to-many