【问题标题】:Django CreateView Foreign keyDjango CreateView 外键
【发布时间】:2018-12-18 10:20:16
【问题描述】:

我需要一些帮助。我正在用 Django 2.1 和 python 3.7 编写一个应用程序

我正在尝试添加一个通过外键与文章关联的新评论。

添加新评论的屏幕url是http://127.0.0.1:8000/articles/1/comment/new/,所以该url有外键。

当我尝试保存评论时,它返回以下错误:

IntegrityError at /articles/1/comment/new/
NOT NULL constraint failed: articles_comment.article_id
Request Method: POST
Request URL:    http://127.0.0.1:8000/articles/1/comment/new/
Django Version: 2.0.6
Exception Type: IntegrityError
Exception Value:    
NOT NULL constraint failed: articles_comment.article_id
Exception Location: /Users/fabiodesimoni/.local/share/virtualenvs/news-s2R6SLTq/lib/python3.7/site-packages/django/db/backends/sqlite3/base.py in execute, line 303
Python Executable:  /Users/fabiodesimoni/.local/share/virtualenvs/news-s2R6SLTq/bin/python
Python Version: 3.7.1
Python Path:    
['/Users/fabiodesimoni/Development/Python/Django/news',
 '/Users/fabiodesimoni/.local/share/virtualenvs/news-s2R6SLTq/lib/python37.zip',
 '/Users/fabiodesimoni/.local/share/virtualenvs/news-s2R6SLTq/lib/python3.7',
 '/Users/fabiodesimoni/.local/share/virtualenvs/news-s2R6SLTq/lib/python3.7/lib-dynload',
 '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7',
 '/Users/fabiodesimoni/.local/share/virtualenvs/news-s2R6SLTq/lib/python3.7/site-packages']
Server time:    Tue, 18 Dec 2018 10:05:07 +0000

如果我将“文章”字段添加到“评论”屏幕,屏幕会加载“文章”字段空白,我必须选择“文章”才能成功保存。我想自动执行,因为文章 id 在 url 中。

我希望所有信息都在这里,如果需要代码,源代码是https://github.com/fabiofilz/newspaper_app

Model.py:

    from django.contrib.auth.models import User
    from django.conf import settings
    from django.contrib.auth import get_user_model
    from django.db import models
    from django.urls import reverse

    class Article(models.Model):
        title = models.CharField(max_length=255)
        body = models.TextField()
        date = models.DateTimeField(auto_now_add=True)
        author = models.ForeignKey(get_user_model(),on_delete=models.CASCADE,)

        REQUIRED_FIELDS = ['author', 'title', 'body']

        def __str__(self):
            return '(id: ' + str(self.id) + ') ' + self.title

        def get_absolute_url(self):
            return reverse('article_detail', args=[str(self.id)])

    class Comment(models.Model):
        article = models.ForeignKey(Article, on_delete=models.CASCADE, related_name='comments')
        comment = models.CharField(max_length=140)
        author = models.ForeignKey( get_user_model(), on_delete=models.CASCADE, )

        def __str__(self):
            return '(id: ' + str(self.id) + ') ' + self.comment

        def get_absolute_url(self):
            reverse('comment_detail', args=[str(self.id)])

url.py

urlpatterns = [
    path('', views.ArticleListView.as_view(), name='article_list'),
    path('<int:pk>/edit/', views.ArticleUpdateView.as_view(), name='article_edit'),
    path('<int:pk>/', views.ArticleDetailView.as_view(), name='article_detail'),
    path('<int:pk>/delete/', views.ArticleDeleteView.as_view(), name='article_delete'),
    path('new/', views.ArticleCreateView.as_view(), name='article_new'),

    path('<article_pk>/comment/<comment_pk>', views.CommentDetailView.as_view(), name='comment_detail'),
    url(r'^(?P<pk>\d+)/comment/(?P<comment_pk>\d+)/delete/$', views.CommentDeleteView.as_view(), name='comment_delete'),
    url(r'^(?P<pk>\d+)/comment/(?P<comment_pk>\d+)/edit/$', views.CommentUpdateView.as_view(), name='comment_edit'),
    path('<article_pk>/comment/new/', views.CommentCreateView.as_view(), name='comment_new'),
]

view.py

from django.contrib.auth.mixins import LoginRequiredMixin
from django.views.generic import ListView, DetailView
from django.views.generic.edit import CreateView, UpdateView, DeleteView
from django.urls import reverse_lazy
from . import models
from django.utils import timezone
from django.shortcuts import redirect

# COMMENT VIEWS

class CommentCreateView(LoginRequiredMixin, CreateView):
    model = models.Comment
    template_name = 'comment_new.html'
    fields = ['comment'] #, 'article']
    success_url = reverse_lazy('article_list')
    login_url = 'login'

    def form_valid(self, form):
        form.instance.author = self.request.user
        return super().form_valid(form)

谢谢

【问题讨论】:

  • 那么您在哪里遇到问题?您已经知道如何自动分配作者,是什么阻止您对文章做同样的事情?
  • 请为您检查这项工作。 stackoverflow.com/questions/50580882/…
  • 感谢您的回复。我有一个包含所有文章的前一个屏幕,每篇文章旁边都有一个关于文章的“添加评论”链接。使用 127.0.0.1:8000/articles/1/comment/new 加载评论页面时,不会填充字段 Article。我认为这是问题所在,但我不知道该怎么做(我猜这是问题所在,因为当我在屏幕中添加字段时,字段 Article 为空白)。

标签: django


【解决方案1】:

我发现了一个类似的问题:

NOT NULL constraint failed Django CreateView

class CommentCreateView(LoginRequiredMixin, CreateView):
    model = models.Comment
    template_name = 'comment_new.html'
    fields = ['comment'] #, 'article']
    success_url = reverse_lazy('article_list')
    login_url = 'login'

    def form_valid(self, form):
        form.instance.author = self.request.user
        form.instance.article = get_object_or_404(models.Article, 
                                                  id=self.kwargs.get('article_pk')) # new line
        return super().form_valid(form)

【讨论】:

    猜你喜欢
    • 2018-11-24
    • 1970-01-01
    • 2018-09-26
    • 1970-01-01
    • 2018-12-13
    • 1970-01-01
    • 1970-01-01
    • 2018-05-02
    • 2018-12-02
    相关资源
    最近更新 更多