Django报错:'GroupDetailView'对象无'object'属性,求解决方案
Django报错:'GroupDetailView' object has no attribute 'object' 解决及群组成员添加功能实现
报错原因
在post方法中,Django的DetailView默认不会自动初始化self.object,直接访问self.object.id会触发属性不存在的错误。而get_context_data能正常访问是因为父类的get_context_data会先调用get_object()赋值self.object,但post方法没有这个默认流程。
修复及功能实现步骤
1. 修正post方法的对象获取逻辑
在post方法开头手动调用get_object()初始化self.object,避免属性不存在的问题:
def post(self, request, *args, **kwargs): # 先获取当前群组对象,初始化self.object self.object = self.get_object() form = AddGroupMemberForm(request.POST, group_id=self.object.id) if form.is_valid(): new_member = form.save(commit=False) new_member.group = self.object new_member.save() return redirect(self.object.get_absolute_url()) else: return self.render_to_response(self.get_context_data(form=form))
2. 添加创建者权限控制
确保只有群组创建者能执行添加成员操作,可在方法内直接校验:
def get_context_data(self, **kwargs): self.object = self.get_object() context = super().get_context_data(**kwargs) # 仅创建者可见添加成员表单 if self.request.user == self.object.author: context['form'] = AddGroupMemberForm(group_id=self.object.id) context['members'] = GroupMembers.objects.filter(group=self.object) return context def post(self, request, *args, **kwargs): self.object = self.get_object() # 校验是否为群组创建者 if request.user != self.object.author: return HttpResponseForbidden("你没有权限添加群组成员") form = AddGroupMemberForm(request.POST, group_id=self.object.id) if form.is_valid(): new_member = form.save(commit=False) new_member.group = self.object new_member.save() return redirect(self.object.get_absolute_url()) else: return self.render_to_response(self.get_context_data(form=form))
如果你想更规范地处理权限,也可以使用PermissionRequiredMixin:
from django.contrib.auth.mixins import PermissionRequiredMixin class GroupDetailView(PermissionRequiredMixin, DetailView): model = Group context_object_name = 'group' template_name = 'rooms/group_detail.html' def has_permission(self): self.object = self.get_object() return self.request.user == self.object.author # 后续get_context_data和post方法同上
3. 补充AddGroupMemberForm的实现(如果未完成)
确保表单能过滤掉已在群组中的用户:
from django import forms from .models import GroupMembers, User class AddGroupMemberForm(forms.ModelForm): def __init__(self, *args, **kwargs): group_id = kwargs.pop('group_id') super().__init__(*args, **kwargs) # 排除已加入当前群组的用户 self.fields['user'].queryset = User.objects.exclude( group_membership__group_id=group_id ) class Meta: model = GroupMembers fields = ['user', 'role']
完整修正后的GroupDetailView代码
from django.views.generic import DetailView from django.shortcuts import redirect from django.http import HttpResponseForbidden from .models import Group, GroupMembers from .forms import AddGroupMemberForm class GroupDetailView(DetailView): model = Group context_object_name = 'group' template_name = 'rooms/group_detail.html' def get_context_data(self, **kwargs): self.object = self.get_object() context = super().get_context_data(**kwargs) if self.request.user == self.object.author: context['form'] = AddGroupMemberForm(group_id=self.object.id) context['members'] = GroupMembers.objects.filter(group=self.object) return context def post(self, request, *args, **kwargs): self.object = self.get_object() if request.user != self.object.author: return HttpResponseForbidden("你没有权限添加群组成员") form = AddGroupMemberForm(request.POST, group_id=self.object.id) if form.is_valid(): new_member = form.save(commit=False) new_member.group = self.object new_member.save() return redirect(self.object.get_absolute_url()) else: return self.render_to_response(self.get_context_data(form=form))
内容的提问来源于stack exchange,提问作者Patryk Palonka
相关产品推荐
相关产品推荐

