【问题标题】:Creating Proper Django Paths创建正确的 Django 路径
【发布时间】: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


    【解决方案1】:

    我在您的代码中发现了几个问题。在您的urlpatterns 中有两条同名路径join

    ...
    path('join/<slug>', views.JoinGroup.as_view(), name='join'), 
    path('leave/<slug>', views.LeaveGroup.as_view(), name='join'), #name='leave' probably
    ...
    

    当命名的 urlpatterns 发生冲突时,反向查找的 URL 取决于项目 urlpatterns 列表中的最后一个模式。查看更多here

    然后,当您使用 reverse('groups:single', kwargs={'slug':self.slug}) 时,您应该传入 kwargs 而不是 slug 而是 groups,因为这是参数的名称。即定义.../&lt;slug:groups&gt; 应该读作groups 类型为slug。所以你的反向应该是这样的:

    reverse('groups:single', kwargs={'groups':self.slug})
    

    在没有命名 url 参数的 urlpatterns 中,您应该使用 reverseargs 参数:

    reverse('groups:join', args = [self.slug])
    

    【讨论】:

      猜你喜欢
      • 2019-01-10
      • 2016-12-10
      • 2012-03-29
      • 1970-01-01
      • 2018-06-18
      • 2020-10-16
      • 1970-01-01
      • 2017-01-07
      • 1970-01-01
      相关资源
      最近更新 更多