python - No URL to redirect to. Either provide a url or define a get_absolute_url method on the Model -


i using createview build form. createview called detailview. once form submitted, want validated, submitted data returned initial detailview.

the detailview calls createview fine. form works expected until submitted. then, error: no url redirect to. either provide url or define get_absolute_url method on model.

i tried using this solution, kicks out same error. tried passing data , redirecting through url calls createview. still same error.

can please tell me how redirect createview original detailview (and passing validated data?

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) 

urls.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'), 

template.html (calls createview , part displays returned data)

<div class="review_buttom_wrapper">     <a href="{% url 'lawyer_createreview' lawyer.lawyer_slug %}?next={% url 'lawyer_detail' lawyer.lawyer_slug %}">         <button class="review_button">             <strong>review</strong> {{ lawyer.name }}         </button>     </a> </div>  {% review in lawyer_reviews %} <div style="padding-left: 15px; padding-right: 15px; overflow:auto;">     <div class="review-masthead">         <div class="medium-3 columns">             <p class="posttime">{{ review.review_created|timesince }} ago </p>             <p class="review-title">{{ review.user_name }} <span class="location">{{ review.lawyer.city }}, {{ review.lawyer.state }}</span></p>          </div>         <div class="medium-7 columns">             <p>{{ review.review_comment }}</p>         </div>         <div class="medium-2 columns">             <div class="user_rating">                 rating             </div>             <div class="rating_number">                 {{ review.rating }}             </div>          </div>     </div> {% endfor %} 

forms.py

rating_choices = (         (1, '1'),         (2, '2'),         (3, '3'),         (4, '4'),         (5, '5'),     )  class reviewform(forms.modelform):     reviewer_name = forms.charfield(widget = forms.textinput(attrs={'class': 'review_input_box', 'placeholder': 'your name'}))     reviewer_city = forms.charfield(widget = forms.textinput(attrs={'class': 'review_input_box', 'placeholder': 'your city'}))     reviewer_state = forms.charfield(widget = forms.textinput(attrs={'class': 'review_input_box', 'placeholder': 'your state'}))     rating = forms.choicefield(choices = rating_choices, label="", initial='', widget = forms.select(attrs={'class': 'review_selector'}), required=true)     email = forms.emailfield(widget = forms.textinput(attrs={'class': 'review_input_box', 'placeholder': 'your-email@email.com'}))     review_comment = forms.charfield(widget = forms.textarea(attrs={'class': 'review_input_box', 'placeholder': 'what say?'}))      class meta:         model = review         fields = ['reviewer_name', 'reviewer_city', 'reviewer_state', 'rating', 'email', 'review_comment']   traceback:  file "/xxxx/xxxxxxxxxx/xxxx/xxxxxxxxxxxx/lib/python3.5/site-packages/django/views/generic/edit.py" in get_success_url   190.                 url = self.object.get_absolute_url()  file "/xxxx/xxxxxxxxxx/xxxx/xxxxxxxxxxxx/ralph/fathers/models.py" in get_absolute_url   142.      return reverse('lawyer_createreview', kwargs={'lawyer_slug': self.lawyer_slug})  during handling of above exception ('review' object has no attribute 'lawyer_slug'), exception occurred:  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/views/generic/base.py" in view   68.             return self.dispatch(request, *args, **kwargs)  file "/xxxx/xxxxxxxxxx/xxxx/xxxxxxxxxxxx/lib/python3.5/site-packages/django/views/generic/base.py" in dispatch   88.         return handler(request, *args, **kwargs)  file "/xxxx/xxxxxxxxxx/xxxx/xxxxxxxxxxxx/lib/python3.5/site-packages/django/views/generic/edit.py" in post   256.         return super(basecreateview, self).post(request, *args, **kwargs)  file "/xxxx/xxxxxxxxxx/xxxx/xxxxxxxxxxxx/lib/python3.5/site-packages/django/views/generic/edit.py" in post   222.             return self.form_valid(form)  file "/xxxx/xxxxxxxxxx/xxxx/xxxxxxxxxxxx/ralph/fathers/views.py" in form_valid   165.      return super(lawyerreviewcreate, self).form_valid(form)  file "/xxxx/xxxxxxxxxx/xxxx/xxxxxxxxxxxx/lib/python3.5/site-packages/django/views/generic/edit.py" in form_valid   202.         return super(modelformmixin, self).form_valid(form)  file "/xxxx/xxxxxxxxxx/xxxx/xxxxxxxxxxxx/lib/python3.5/site-packages/django/views/generic/edit.py" in form_valid   108.         return httpresponseredirect(self.get_success_url())  file "/xxxx/xxxxxxxxxx/xxxx/xxxxxxxxxxxx/lib/python3.5/site-packages/django/views/generic/edit.py" in get_success_url   193.                     "no url redirect to.  either provide url or define"  exception type: improperlyconfigured @ /xxxxxxx/xxxxxxx/xxxxxxx-xxxxxx/createreview/ exception value: no url redirect to.  either provide url or define get_absolute_url method on model. 

traceback after changing get_absolute_url on review model

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 @ /admin/r/14/1/ exception value: reverse 'lawyer_createreview' arguments '()' , keyword arguments '{'review_slug': 'michael-ferrin'}' not found. 1 pattern(s) tried: ['fathers/lawyers/(?p<lawyer_slug>[\\w-]+)/createreview/$'] 

the best way add method get_success_url on create view , use redirect detail view. in create view have object after saved, so

class lawyerreviewcreate(createview): def get_success_url(self): return reverse('lawyer_detail', kwargs={'lawyer_slug': self.object.lawyer_slug})

this automatically send user detail view if form valid.

also, make sure kwargs using correct key, appear using review_slug in cases , lawyer_slug in other cases


Comments