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
Post a Comment