Python 没有要重定向到的URL。在模型上提供url或定义get_absolute_url方法

Python 没有要重定向到的URL。在模型上提供url或定义get_absolute_url方法,python,django,forms,python-3.x,django-class-based-views,Python,Django,Forms,Python 3.x,Django Class Based Views,我正在使用CreateView构建表单。从DetailView调用CreateView。提交表单后,我希望将已验证、提交的数据返回到初始DetailView DetailView可以很好地调用CreateView。表单在提交之前按预期工作。然后,我得到这个错误:没有要重定向到的URL。在模型上提供url或定义get_absolute_url方法。 我尝试使用,但它踢出相同的错误。我尝试通过调用CreateView的URL传递数据并重定向。我仍然会犯同样的错误 有人能告诉我如何将CreateVie

我正在使用CreateView构建表单。从DetailView调用CreateView。提交表单后,我希望将已验证、提交的数据返回到初始DetailView

DetailView可以很好地调用CreateView。表单在提交之前按预期工作。然后,我得到这个错误:没有要重定向到的URL。在模型上提供url或定义get_absolute_url方法。

我尝试使用,但它踢出相同的错误。我尝试通过调用CreateView的URL传递数据并重定向。我仍然会犯同样的错误

有人能告诉我如何将CreateView重定向回原始的DetailView(并传回已验证的数据)吗

models.py

class Lawyer(models.Model):
    name = models.CharField(max_length=100, default='')
    practice_area = models.CharField(max_length=100, default='')
    address = models.CharField(max_length=255, default='')
    city = models.CharField(max_length=50, default='')
    state = models.CharField(max_length=2, default='')
    zipcode = models.CharField(max_length=10, default='')
    telephone = models.CharField(max_length=15, default='')
    years_practice = models.IntegerField(default=10)
    objects = models.Manager()
    lawyer_slug = models.SlugField(default='')

    def get_absolute_url(self):
        return reverse('lawyer_detail', kwargs={'lawyer_slug': self.lawyer_slug})

    def __str__(self):
        return self.name

class Review(models.Model):
    RATING_CHOICES = (
        (0, '0'),
        (1, '1'),
        (2, '2'),
        (3, '3'),
        (4, '4'),
        (5, '5'),
    )
    lawyer = models.ForeignKey(Lawyer, null=True)
    review_created = models.DateTimeField('Date of Review', auto_now_add=True)
    reviewer_name = models.CharField(max_length=55, default='')
    reviewer_city = models.CharField(max_length=55, default='')
    reviewer_state = models.CharField(max_length=2, default='')
    email = models.EmailField(default='')
    rating = models.IntegerField(default=1, choices=RATING_CHOICES)
    review_comment = models.TextField(default='')
    review_slug = models.SlugField(default='')

    def get_absolute_url(self):
        return reverse('lawyer_createreview', kwargs={'review_slug': self.review_slug})

    def __str__(self):
        return self.review_slug
views.py

class LawyerDetail(DetailView):
    model = Lawyer

    template = 'lawyer_detail.html'

    context_object_name = 'lawyer'

    def get_object(self):
        lawyer_slug = Lawyer.objects.get(
            lawyer_slug=self.kwargs.get('lawyer_slug')
        )
        return lawyer_slug

    def get_context_data(self, **kwargs):
        context = super(LawyerDetail, self).get_context_data(**kwargs)
        context['lawyer_reviews'] = self.object.review_set.all()
        return context

class LawyerReviewCreate(CreateView):
    model = Review
    form_class = ReviewForm

    def get_form_kwargs(self, **kwargs):
        kwargs = super(LawyerReviewCreate, self).get_form_kwargs()
        redirect = self.request.GET.get('next')
        if redirect:
            if 'initial' in kwargs.keys():
                kwargs['initial'].update({'next': redirect})
            else:
                kwargs['initial'] = {'next': redirect}
        return kwargs

    def form_invalid(self, form):
        import pdb;pdb.set_trace()  # debug example

        return super(LawyerReviewCreate, self).form_invalid(form)

    def form_valid(self, form):
        redirect = form.cleaned_data.get('next')
        if redirect:
            self.success_url = redirect
        return super(LawyerReviewCreate, self).form_valid(form)
url.py

url(r'^lawyers/(?P<lawyer_slug>[\w-]+)/$', LawyerDetail.as_view(), name='lawyer_detail'),
url(r'^lawyers/(?P<lawyer_slug>[\w-]+)/createreview/$', LawyerReviewCreate.as_view(), name='lawyer_createreview'),
更改审阅模型上的get_absolute_url后的回溯

Traceback:

File "/xxxx/xxxxxxxxxx/xxxx/xxxxxxxxxxxx/lib/python3.5/site-packages/django/core/handlers/base.py" in get_response
  149.                     response = self.process_exception_by_middleware(e, request)

File "/xxxx/xxxxxxxxxx/xxxx/xxxxxxxxxxxx/lib/python3.5/site-packages/django/core/handlers/base.py" in get_response
  147.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "/xxxx/xxxxxxxxxx/xxxx/xxxxxxxxxxxx/lib/python3.5/site-packages/django/contrib/admin/sites.py" in wrapper
  265.                 return self.admin_view(view, cacheable)(*args, **kwargs)

File "/xxxx/xxxxxxxxxx/xxxx/xxxxxxxxxxxx/lib/python3.5/site-packages/django/utils/decorators.py" in _wrapped_view
  149.                     response = view_func(request, *args, **kwargs)

File "/xxxx/xxxxxxxxxx/xxxx/xxxxxxxxxxxx/lib/python3.5/site-packages/django/views/decorators/cache.py" in _wrapped_view_func
  57.         response = view_func(request, *args, **kwargs)

File "/xxxx/xxxxxxxxxx/xxxx/xxxxxxxxxxxx/lib/python3.5/site-packages/django/contrib/admin/sites.py" in inner
  244.             return view(request, *args, **kwargs)

File "/xxxx/xxxxxxxxxx/xxxx/xxxxxxxxxxxx/lib/python3.5/site-packages/django/contrib/contenttypes/views.py" in shortcut
  31.     absurl = get_absolute_url()

File "/xxxx/xxxxxxxxxx/xxxx/xxxxxxxxxxxx/xxxxx/xxxxxxx/models.py" in get_absolute_url
  142.      return reverse('lawyer_createreview', kwargs={'review_slug': self.review_slug})

File "/xxxx/xxxxxxxxxx/xxxx/xxxxxxxxxxxx/lib/python3.5/site-packages/django/core/urlresolvers.py" in reverse
  600.     return force_text(iri_to_uri(resolver._reverse_with_prefix(view, prefix, *args, **kwargs)))

File "/xxxx/xxxxxxxxxx/xxxx/xxxxxxxxxxxx/lib/python3.5/site-packages/django/core/urlresolvers.py" in _reverse_with_prefix
  508.                              (lookup_view_s, args, kwargs, len(patterns), patterns))

Exception Type: NoReverseMatch at /admin/r/14/1/
Exception Value: Reverse for 'lawyer_createreview' with arguments '()' and keyword arguments '{'review_slug': 'michael-ferrin'}' not found. 1 pattern(s) tried: ['fathers/lawyers/(?P<lawyer_slug>[\\w-]+)/createreview/$']
回溯:
get_响应中的文件“/xxxx/xxxxxxxxxxxxx/xxxxxxxxxxxxx/lib/python3.5/site packages/django/core/handlers/base.py”
149.response=self.process\u异常\u由\u中间件(e,请求)
get_响应中的文件“/xxxx/xxxxxxxxxxxxx/xxxxxxxxxxxxx/lib/python3.5/site packages/django/core/handlers/base.py”
147.response=wrapped_callback(请求,*callback_args,**callback_kwargs)
包装器中的文件“/xxxx/xxxxxxxxx/xxxxxxxxxxx/lib/python3.5/site packages/django/contrib/admin/sites.py”
265.返回self.admin_视图(视图,可缓存)(*args,**kwargs)
文件“/xxxx/xxxxxxxxx/xxxxx/xxxxxxxxxxxxx/lib/python3.5/site packages/django/utils/decorators.py”在_包装视图中
149.响应=查看函数(请求,*args,**kwargs)
文件“/XXXXX/XXXXXXXXX/XXXXXXXXXXXXX/lib/python3.5/site packages/django/views/decorators/cache.py”在
57.响应=查看功能(请求,*args,**kwargs)
文件“/xxxx/xxxxxxxxx/xxxxx/xxxxxxxxxxxxx/lib/python3.5/site packages/django/contrib/admin/sites.py”,位于内部
244.返回视图(请求,*args,**kwargs)
快捷方式中的文件“/xxxx/xxxxxxxxx/xxxxxxxxxxx/lib/python3.5/site packages/django/contrib/contenttypes/views.py”
31.absurl=get\u absolute\u url()
获取绝对url中的文件“/xxxx/xxxxxxxxx/xxxxxxxxxx/xxxxx/xxxxxxx/xxxxxxx/models.py”
142.返回反向('lawyer\u createreview',kwargs={'review\u slug':self.review\u slug})
文件“/xxxx/xxxxxxxxx/xxxxx/xxxxxxxxxxxxx/lib/python3.5/site packages/django/core/urlresolvers.py”的相反位置
600.返回强制_文本(iri_到_uri(解析器._反向_,带_前缀(视图,前缀,*args,**kwargs)))
文件“/xxxx/xxxxxxxxx/xxxxx/xxxxxxxxxxxxx/lib/python3.5/site packages/django/core/urlresolvers.py”在带前缀的_reverse_中
508.(查找视图、args、kwargs、len(模式)、模式)
异常类型:NoReverseMatch at/admin/r/14/1/
异常值:找不到参数“()”和关键字参数“{'review\u slug':'michael ferrin'}”的'lawyer\u createreview'的相反值。尝试了1种模式:[“父亲/律师/(?P[\\w-]+)/createreview/$”]

最好的方法是在创建视图上添加一个方法
get_success\u url
,并使用该方法重定向回详细视图。在“创建”视图中,保存对象后,您将看到该对象,如下所示

class LawyerReviewCreate(CreateView):
    def get_success_url(self):
        return reverse('lawyer_detail', kwargs={'lawyer_slug': self.object.lawyer_slug})
如果表单有效,这将自动将用户发送回详细信息视图


此外,请确保您的kwargs使用了正确的键,在某些情况下,您似乎使用了review\u slug,在其他情况下,您使用的是律师\u slug

我们可以按照Django的建议,在我们的模型中添加一个“get\u absolute\u url”。它为一个对象设置了一个规范的URL,这样即使URL的结构在将来发生变化,对特定对象的引用也会改变 是一样的。简言之,您应该将get_absolute_url()方法添加到 你写的每一个模型

def get_absolute_url(self): # new
    return reverse('lawyer_detail', args=[str(self.id)])

这将解决您的问题

请将完整的错误回溯添加到您的问题中!
Review.get\u absolute\u url()
中的
reverse
中的参数有错误。它们看起来像是给律师的。更改了参数。获取新错误。请查看新的回溯。提交表单后,新url似乎没有从CreateView路由回原始DetailView。您正在
get\u absolute\u url
中传递
review\u slug
参数,但该url的url定义中没有此类参数(它只有一个
slug
)。别忘了从django.url反向导入
。此外,reverse的第一个参数应该是在url.py中指定的视图的名称。
class LawyerReviewCreate(CreateView):
    def get_success_url(self):
        return reverse('lawyer_detail', kwargs={'lawyer_slug': self.object.lawyer_slug})
def get_absolute_url(self): # new
    return reverse('lawyer_detail', args=[str(self.id)])