首页 > 解决方案 > 如何使用我的 reverse_lazy 函数解决此错误?

问题描述

使用 CreateView 时出现以下错误:

NoReverseMatch at /campus/NG Waverley Central/create
Reverse for 'campus_page' with no arguments not found. 1 pattern(s) tried: ['campus/(?P<campusid>[^/]+)/$']

我怀疑这与我从CampusPage视图向前传递Campusid的事实有关,并且我不知道如何在 reverse_lazy 函数中传递这个Campusid 。

我的 urls.py 如下所示:

urlpatterns = [
    path('<str:campusid>/', views.CampusPage, name='campus_page'),
    path('login/', auth_views.LoginView.as_view(), name='login'),
    path('<str:campusid>/create', views.CreateStreamEvent.as_view(),name='create_streamevent'),
]

我的 views.py 如下所示:

def CampusPage(request, campusid):

    campusobj = CampusModel.objects.filter(campus_name=campusid)

    return render(request, 'campus/campus_page.html',{'campusid':campusid,'campusobj':campusobj})

class CreateStreamEvent(LoginRequiredMixin, CreateView):
    model = StreamEvent
    fields = ['title','campus']
    template_name = 'campus/create_streamevent.html'
    success_url = reverse_lazy('campus_page')

    def form_valid(self, form):
        form.instance.user = self.request.user
        super(CreateStreamEvent, self).form_valid(form)
        return redirect('campus_page')

我不知道是否有必要,但我的 models.py 如下所示:

class CampusModel(models.Model):
    campus_name = models.CharField(max_length=255, unique=True)
    description = models.TextField(blank=True,default='')
    banner = models.ImageField(upload_to=None, height_field=None, width_field=None, max_length=100,null=True)
    user = models.ForeignKey(User, on_delete=models.CASCADE)

    def __str__(self):
        return self.campus_name

class StreamEvent(models.Model):
    title = models.CharField(max_length=255)
    date_added = models.DateField(auto_now=False, auto_now_add=True)
    date_published = models.DateField(auto_now=True, auto_now_add=False)
    campus = models.ForeignKey(CampusModel, on_delete=models.CASCADE)

    def __str__(self):
        return self.title

class Video(models.Model):
    title = models.CharField(max_length=255)
    url = models.URLField()
    youtube_id = models.CharField(max_length=255)
    streamevent = models.ForeignKey(StreamEvent, on_delete=models.CASCADE,null=True)

    def __str__(self):
        return self.title

标签: pythondjangodjango-viewsdjango-forms

解决方案


在您看来,您写道:

success_url = reverse_lazy('campus_page')

但是 urlcampus_page需要一个关键字参数campusid。而不是设置success_url覆盖get_success_url:

from django.urls import reverse

class CreateStreamEvent(LoginRequiredMixin, CreateView):
    model = StreamEvent
    fields = ['title','campus']
    template_name = 'campus/create_streamevent.html'

    def form_valid(self, form):
        form.instance.user = self.request.user
        return super(CreateStreamEvent, self).form_valid(form)
    
    def get_success_url(self):
        return reverse('campus_page', kwargs={'campusid': self.kwargs.get('campusid')})

推荐阅读