DeleteView with 2 arguements post and user

旧时模样 提交于 2020-01-03 04:25:27

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!