【发布时间】:2021-03-23 11:35:12
【问题描述】:
每个组都需要自己的 url 才能查看,但是,我对构建 URL 路径的理解似乎不完整。我目前对每个包含“slug”的路径都不起作用。我正在尝试使最终 URL 看起来像“.../groups/posts/in/group_name”。
urls.py
app_name = 'groups'
urlpatterns = [
path('', views.ListGroups.as_view(), name='all'),
path('new/', views.CreateGroup.as_view(), name='create'),
path('posts/in/<slug:groups>', views.SingleGroup.as_view(), name='single'),
path('join/<slug>', views.JoinGroup.as_view(), name='join'),
path('leave/<slug>', views.LeaveGroup.as_view(), name='join'),
]
views.py
from .models import Group, GroupMember
# Create your views here.
class CreateGroup(LoginRequiredMixin, generic.CreateView):
fields = ['name', 'description']
model = Group
class SingleGroup(generic.DetailView):
model = Group
class ListGroups(generic.ListView):
model = Group
class JoinGroup(LoginRequiredMixin, generic.RedirectView):
def get_redirect_url(self, *args, **kwargs):
return reverse('groups:single', kwargs={'slug':self.kwargs.get('slug')})
def get(self, request, *args, **kwargs):
group = get_object_or_404(Group, slug=self.kwargs.get('slug'))
try:
GroupMember.objects.create(user=self.request.user, group=group)
except IntegrityError:
messages.warning(request, 'You are a already a member')
else:
messages.success(request, 'You are now a member')
return super().get(request, *args, **kwargs)
class LeaveGroup(LoginRequiredMixin, generic.RedirectView):
def get_redirect_url(self, *args, **kwargs):
return reverse('groups:single', kwargs={'slug':self.kwargs.get('slug')})
def get(self, request, *args, **kwargs):
try:
membership = GroupMember.objects.filter(
user=self.request.user,
group__slug=self.kwargs.get('slug')
).get()
except GroupMember.DoesNotExist:
messages.warning(request, 'You are not in this group')
else:
messages.success(request, 'You have successfully left this group')
return super().get(request, *args, **kwargs)
models.py
User = get_user_model()
register = template.Library()
# Create your models here.
class Group(models.Model):
name = models.CharField(max_length=255, unique=True)
slug = models.SlugField(allow_unicode=True, unique=True)
description = models.TextField(blank=True, default='')
description_html = models.TextField(editable=False, default='', blank=True)
members = models.ManyToManyField(User, through='GroupMember')
def __str__(self):
return self.name
def save(self, *args, **kwargs):
self.slug = slugify(self.name)
self.description = misaka.html(self.description)
super().save(*args, **kwargs)
def get_absolute_url(self):
return reverse('groups:single', kwargs={'slug':self.slug})
class Meta:
ordering = ['name']
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.DO_NOTHING)
def __str__(self):
return self.user.username
class Meta:
unique_together = ('group', 'user')
我已经混淆了实际脚本中的大部分导入。
【问题讨论】:
标签: python django django-urls