问题
I have a delete view with 2 conditions "post" and "user".
The user requirement is fulfilled by self.object.user = self.request.user
and post requirement is fulfilled by slug = self.kwargs['slug']
(I think this may be the culprit)
Are my views correct?
I am new to python please forgive any silly mistakes.
Views.py
class ProofDelete(LoginRequiredMixin, DeleteView):
model = Proof
def delete(self, *args, **kwargs):
return super().delete(*args, **kwargs)
def get_success_url(self, *args, **kwargs):
slug = self.kwargs['slug']
print(slug)
obj = get_object_or_404(Post, slug=slug)
url_ = obj.get_absolute_url()
user = self.request.user
if user.is_authenticated():
if user in obj.made.all():
obj.made.remove(user)
else:
obj.made.add(user)
return url_
models.py
User = get_user_model()
class Proof(models.Model):
user = models.ForeignKey(User, related_name='proofmade')
post = models.ForeignKey(Post, related_name='proofmade')
made_at = models.DateTimeField(auto_now=True)
image_of_proof= models.ImageField()
proof_ = models.ImageField()
suggestions = models.TextField(max_length=1000)
def __str__(self):
return self.post.title
urls.py
app_name = 'proof'
urlpatterns = [
url(r'^new_proof/(?P<slug>[-\w]+)/$', views.ProofCreate.as_view(), name='new_proof'),
url(r'^proof_delete/(?P<pk>\d+)/$', views.ProofDelete.as_view(),name='proof_delete'),
also tried
url (r'^proof_delete/(?P<slug>[-\w]+)/(?P<pk>\d+)/$', views.ProofDelete.as_view(), name='proof_delete'),
I get the below error. Indicating error in the views
Error Message Click to see Error message
Same error message after scrolling down. Click to open
回答1:
The answer was in the templates. Adding a forloop after the "if" statement solved the issue. Doing this handles both arguments of the Url. "slug" of "post" model and "pk" of the "proof" model. Without the forloop It was almost impossible to satisfy both arguments of the URL
The correct Url thanks to "Paulo Almeida"
url (r'^proof_delete/(?P<slug>[-\w]+)/(?P<pk>\d+)/$', views.ProofDelete.as_view(), name='proof_delete')
Below is the template
{% if user in post.made.all %}
{% for proof in user.proofmade.all %}
<a href="{% url 'proof:proof_delete' slug=post.slug pk=proof.pk %}">
<img src="{% static 'images/thumbs_up_RED.png' %}" height="25px">
</a><br/>
{% endfor %}
{% else %}
<a href="{% url 'proof:new_proof' slug=post.slug %}">
<img src="{% static 'images/thumbs_up_BLANK.png' %}" height="25px">
</a><br/>
{% endif %}
来源:https://stackoverflow.com/questions/49960589/deleteview-with-2-arguements-post-and-user