添加评论到文章django createview foreignkey

时间:2017-07-12 03:53:54

标签: python django comments django-class-based-views

我想使用django createview为我的文章添加评论。目前,我可以毫无问题地添加文章。我可以添加评论。但我无法将评论添加到正确的文章中。

我已经在这两天了。我真的很想用cbv这样做,因为我正在努力学习。任何帮助解释我做错了什么以及如何纠正它都将非常感激。

models.py

class Article(models.Model):
    title = models.CharField(max_length=255)
    slug = models.SlugField(max_length=255, null=True, blank=True)
    content = models.TextField(default='')
    author = models.ForeignKey(User)
    featured_image = models.ImageField(upload_to='articles/featured_image', default='')
    created = models.DateTimeField(auto_now_add=True)
    update_date = models.DateTimeField(blank=True, null=True)
    update_author = models.ForeignKey(User, null=True, blank=True,
                                    related_name="+")

    class Meta:
        verbose_name = 'Article'
        verbose_name_plural = 'Articles'
        ordering = ['-created',]


    def save(self, *args, **kwargs):
        self.slug = slugify(self.title)
        super(Article, self).save(*args, **kwargs)

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('articles:article-detail', kwargs={'slug': self.slug})


class ArticleComment(models.Model):
    article = models.ForeignKey(Article, 
                                related_name='comments',
                                null=True)
    author = models.ForeignKey(User,
                                null=True)
    text = models.TextField()
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)

    class Meta:
        verbose_name = 'Article Comment'
        verbose_name_plural = 'Article Comments'


    def __str__(self):
        return self.text 

views.py

class ArticleDetailView(DetailView):
    model = Article
    context_object_name = 'article'

    def get_context_data(self, **kwargs):
        context = super(ArticleDetailView, self).get_context_data(**kwargs)
        article = Article.objects.all()
        context['sidebar_articles'] = article.order_by('-created')[:15]
        return context


class CreateArticleView(LoginRequiredMixin, CreateView):
    model = Article
    fields = ['title', 'content']

    def form_valid(self, form):
        article = form.save(commit=False)
        #featured_image = form.cleaned_data['featured_image']
        form.instance.author = self.request.user
        form.save()
        return super(CreateArticleView, self).form_valid(form)


class UpdateArticleView(UpdateView):
    model = Article 


class DeleteArticleView(DeleteView):
    model = Article 


class CreateArticleComment(CreateView):
    model = ArticleComment 
    fields = ('text',)

    def post_valid(self, form):
        post = get_object_or_404(Post, 
                                    slug=article.slug)
        article = Article.objects.all()
        articlecomment = form.save(commit=False)
        articlecomment.author = self.request.user
        articlecomment.article = article
        articlecomment.save()
        return redirect('articles:article-detail', slug=article.slug)

    def get_success_url(self):
        return reverse_lazy('articles:article-list')

urls.py

urlpatterns = [
    url(r'^$',
        ArticleListView.as_view(),
        name = 'article-list'),


    url(r'^add-article/$',
        CreateArticleView.as_view(),
        name = 'create-article'),



    url(r'^(?P<slug>[-\w]+)/$',
        ArticleDetailView.as_view(),
        name = 'article-detail'),


    url(r'^(?P<slug>[/w-]+)/update/$',
        UpdateArticleView.as_view(),
        name = 'update-article'),


    url(r'^(?P<slug>[/w-]+)/delete/$',
        DeleteArticleView.as_view(),
        name = 'delete-article'),


    url(r'^(?P<slug>[-\w]+)/comment/$',
        CreateArticleComment.as_view(),
        name = 'add-article-comment'),


]

template.html

{% extends 'articles/base.html' %}
{% load static %}
{% load cloudinary %}


{% block page_title %}{{ object.title | title }} | Dad Support{% endblock %}

{% block page_css %}
    <style>
        body {background: rgba(233, 235, 238, 1); color: 50,50,50,1);}
        .header {background: white; overflow: hidden; padding: 10px 0;}
        .navigation {text-align: center;}
        h1 {text-transform: uppercase; font-size: 1.25rem; font-weight: 900; font-family: "Cabin"; padding: 1rem 0.5rem 0.5rem;}
        a {color: rgba(0,0,51,1); font-weight: 900;}
        a:hover {color: rgba(0,0,51,0.8);}
        .fa {display: block;}

        .main {margin: 2rem 0; overflow:hidden;}

        .article-container {background: rgba(255,255,255,1); border-radius: 5px;}
        .article-container p {padding: 0rem 1rem;}
        .first-sidebar {height: 694px;}

        .trending-stories,
        .entrance-wrapper,
        .article-sidebarad {background: white; overflow:auto; border-radius: 5px;}

        .trending-stories,
        .entrance-wrapper, 
        .article-sidebarad {font-size: 0.9rem; padding: 1rem; text-align: center;}

        .entrance-wrapper span {display: block; margin-top: 0.375rem;}

        .spacer {margin: 10px 0;}

        .article-sidebarad img {width: 300px; height: 300px;}

        .trending-stories a {text-transform: capitalize;}

        .trending-stories {text-align: left;}

        .trending-stories-wrapper,
        .article-sidebarad-wrapper {margin: 0 10px;}

        .trending-stories h2,
        .article-sidebarad h2 {font-size: 0.8rem; font-weight: 900; text-transform: uppercase; text-align: left;}
        .trending-stories h3 {font-size: 0.9rem; margin: 0; padding: 0; font-weight: 600;}

    </style>
{% endblock %}

{% block page_content %}
    <div class="row">
        <div class="main">
            <div class="medium-11 small-centered">
                <div class="small-8 medium-8 large-8 columns">
                    <div class="article-container">
                        <h1>{{ article.title }}</h1>
                        {% cloudinary article.featured_image height="469" width="703" crop="scale" %}
                        <p class="text-body">{{ article.content |linebreaks}}</p>
                    </div>
                    <div class="comment-container">
                        <a class="btn btn-default" href="{% url 'articles:add-article-comment' slug=article.slug %}">Add comment</a>
                        {% for comment in article.comments.all %}
                            <div class="comment">
                                <div class="date">{{ comment.created }}</div>
                                <strong>{{ comment.author }}</strong>
                                <p>{{ comment.text|linebreaks }}</p>
                            </div>
                        {% empty %}
                            <p>No comments here yet :(</p>
                        {% endfor %}
                    </div>
                </div>
                <div class="small-4 medium-4 large-4 columns">
                    <div class="article-sidebar">
                        <div class="entrance-wrapper">
                            {% if not user.is_authenticated %}
                            <div class="row">
                                <div class="medium-3 columns">
                                    <p>
                                        <a href="{% url 'articles:create-article' %}">
                                            <i class="fa fa-pencil fa-2x" aria-hidden="true">
                                                <span>Publish</span>
                                            </i>
                                        </a>
                                    </p>
                                </div>
                                <div class="medium-3 columns">
                                    <p>
                                        <a href="{% url 'contact:contact-list' %}">
                                            <i class="fa fa-phone fa-2x" aria-hidden="true">
                                                <span>Contact</span>
                                            </i>
                                        </a>
                                    </p>
                                </div>
                                <div class="medium-3 columns">
                                    <p>
                                        <a href="{% url 'profiles:register' %}">
                                            <i class="fa fa-user-plus fa-2x" aria-hidden="true">
                                                <span>Register</span>
                                            </i>
                                        </a>
                                    </p>
                                </div>
                                <div class="medium-3 columns">
                                    <p>
                                        <a href="{% url 'profiles:login' %}">
                                            <i class="fa fa-sign-in fa-2x" aria-hidden="true">
                                                <span>Sign In</span>
                                            </i>
                                        </a>
                                    </p>
                                </div>
                                {% endif %}
                                {% if user.is_authenticated %}
                                    <div class="row">
                                        <div class="medium-3 columns">
                                            <p>
                                                <a href="{% url 'articles:create-article' %}">
                                                    <i class="fa fa-pencil" aria-hidden="true">
                                                        <span>Publish</span>
                                                    </i>
                                                </a>
                                            </p>
                                        </div>
                                        <div class="medium-3 columns">
                                            <p>
                                                <a href="{% url 'contact:contact-list' %}">
                                                    <i class="fa fa-phone" aria-hidden="true">
                                                        <span>Contact</span>
                                                    </i>
                                                </a>
                                            </p>
                                        </div>
                                        <div class="medium-3 columns">
                                            <p>
                                                <a href="{% url 'profiles:profile-detail' user.username %}">
                                                    <i class="fa fa-user-circle" aria-hidden="true">
                                                        <span>Profile</span>
                                                    </i>
                                                </a>
                                            </p>
                                        </div>
                                        <div class="medium-3 columns">
                                            <p>
                                                <a href="{% url 'profiles:logout' %}">
                                                    <i class="fa fa-sign-out" aria-hidden="true">
                                                        <span>Sign Out</span>
                                                    </i>
                                                </a>
                                            </p>
                                        </div>
                                    </div>
                                    <p>Welcome {{ user.username }} !!!</p>       
                                {% endif %}
                            </div>                          
                        </div>
                        <div class="spacer"></div>
                        <div class="article-sidebarad">
                            <h2>sponsored</h2>
                            <img src="file:///home/absinthe62/Downloads/milkyway.jpg" height="280" width="336">
                        </div>
                        <div class="spacer"></div>
                        <div class="trending-stories">
                            <div class="row">
                                <div class="medium-12">
                                    <div class="trending-stories-wrapper">
                                        <h2>Article Vault</h2>
                                        {% for article in sidebar_articles %}
                                            <h3>
                                                <a href="{% url 'articles:article-detail' article.slug %}">{{ article.title }}</a>
                                            </h3>
                                            <p class="sidebar-body">{{ article.body| truncatewords:13 }}</p>
                                        {% endfor %}
                                    </div>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
{% endblock %}

2 个答案:

答案 0 :(得分:2)

我认为这是你想要的

class CreateArticleComment(CreateView):
    model = ArticleComment 
    fields = ('text',)

    def post_valid(self, form):
        article = get_object_or_404(Article, 
                                    slug=article.slug) # Replaced 'Post' with 'Article'
        articlecomment = form.save(commit=False)
        articlecomment.author = self.request.user
        articlecomment.article = article
        articlecomment.save()
        return redirect('articles:article-detail', slug=article.slug)

    def get_success_url(self):
        return reverse_lazy('articles:article-list')

答案 1 :(得分:0)

您正在将查询集分配给外键字段:

Ord

线

let logo = UIImage(named: "logo.png")
let imageView = UIImageView(image:logo)
self.navigationItem.titleView = imageView

需要更改为

class CreateArticleComment(CreateView):
    model = ArticleComment 
    fields = ('text',)

def post_valid(self, form):
    post = get_object_or_404(Post, 
                                slug=article.slug)
    article = Article.objects.all()                <----------------------------
    articlecomment = form.save(commit=False)
    articlecomment.author = self.request.user
    articlecomment.article = article
    articlecomment.save()
    return redirect('articles:article-detail', slug=article.slug)

def get_success_url(self):
    return reverse_lazy('articles:article-list')

由于我们要为特定文章分配评论,该文章的子句在当前网址中显示为:

http://example.com/ sl弹 /评论/

这将使我们能够获得用户发表评论的相关文章。