python - 创建对象后将登录用户附加到对象

标签 python django django-models refactoring

我正在尝试让登录的用户填写表格来创建组。在创建组时,我需要将用户自动添加到组中。

对于这个问题,我们正在使用两种模型 - 用户和组。

User是Django提供的默认模型。

组的定义如下:

class Group(models.Model):
    name = models.CharField(max_length=255, unique=True)
    admins = models.ManyToManyField(User, default=1, related_name='user_username')
    all_users = models.ManyToManyField(User, default=1)

    def __str__(self):
        return self.name

    def get_absolute_url(self):
        return reverse('home')

    def get_admins(self):
        return ", ".join([u.username for u in self.admins.all()])

    def add_admin(self, user):
        self.admins.add(user)

    def get_all_users(self):
        return ", ".join([u.username for u in self.all_users.all()])

    def add_user(self, user):
        self.all_users.add(user)
        self.save()

    def is_admin(self, user):
        if user in self.admins.all():
            return True
        else:
            return False

我试图重构的 View 是:

@login_required
def user_generated_group(request):
    if request.method == 'POST':
        form = GroupForm(request.POST)
        user = request.user
        if form.is_valid():
            group = Group.objects.create(name=form.cleaned_data['name'])
            group.add_admin(user)
            group.add_user(user)
            group.save()
        return HttpResponseRedirect(reverse('home'))
    else:
        form = GroupForm()
        context = {
            'form': form,
            'type': 'group',
            'sidebar': Sidebar(request),
        }
        return render(request, 'form.html', context)

这是小组表格:

class GroupForm(forms.ModelForm):
    class Meta:
        model = Group
        fields = '__all__'
        exclude = ['all_users', 'admins', ]

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['name'].widget.attrs.update({'class': 'input'})

目标是利用 Django 的内置 CreateView。到目前为止,重构的 View 如下所示:

class CreateGroup(LoginRequiredMixin, CreateView):
    model = Group
    form_class = GroupForm
    template_name = 'form.html'

我尚未对此 View 实现 add_user 和 add_admin 逻辑。希望我可以在其他地方管理这些方法。

我不确定从这里该去哪里。这个逻辑应该由用户还是组来处理?

如果是团体,我应该使用经理吗?

如果由用户创建,我应该创建自定义用户模型吗?

最佳答案

您可以覆盖 form_valid [Django-doc]方法,将 self.request.user 添加到组中,例如:

from django.http import HttpResponseRedirect

class CreateGroup(LoginRequiredMixin, CreateView):
    model = Group
    form_class = GroupForm
    template_name = 'form.html'

    def <b>form_valid</b>(self, form):
        self.object = group = form.save()
        <b>group.all_users.add(self.request.user)</b>
        return HttpResponseRedirect(self.get_success_url())

关于python - 创建对象后将登录用户附加到对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56817978/

相关文章:

python - 仅在 Pandas python 中索引和选择找到的列

Django {{ user }} 不会在没有通用 View 的模板中返回用户对象

Django :How to integrate Django Rest framework in an existing application?

python - Django - 在模型中存储未转义的 html

django - 使用表名检索模型对象

python - 类型错误 : '<' not supported between instances of 'PrefixRecord' and 'PackageRecord' while updating Conda

Python ejabberd Auth 脚本不响应数据库中的更改

python - 在动态优化问题中实现不确定性

python - Django 应用程序默认设置?

python - Django 教程中的 __str__(self) 返回对象而不是文本