python - Django ModelForm 不保存在数据库上创建帖子的用户

标签 python django django-forms django-views django-1.10

这里是 Django 初学者,在让表单正常工作时遇到很多麻烦。我尝试了不同的方法,但无法将用户保存在数据库中。我收到此错误:

"IntegrityError at /n_post/ NOT NULL constraint failed: learning_logs_post.owner_id"

views.py:

def nuovo_post(request):
    if request.method != 'POST':
        # No data submitted; create a blank form.
        form = PostForm()
    else:
        # POST data submitted; process data.
        form = PostForm(request.POST)
        if form.is_valid():
            n_post = form.save(commit=False)
            n_post.owner = request.user
            n_post.save()
            return HttpResponseRedirect(reverse('learning_logs:posts'))
    context = {'form': form}
    return render(request, 'learning_logs/nuovo_post.html', context)

模型.py:

class Post(models.Model):
    title = models.CharField(max_length=200)
    description = models.TextField()
    image = models.ImageField(blank=True)
    date_added = models.DateTimeField(auto_now_add=True)
    owner = models.ForeignKey(User)

表单.py:

class PostForm(forms.ModelForm):
    class Meta:
        model = Post
        fields = ['title', 'description', 'image']
        labels = {'title': "Title", 'description': "Description"}
        widgets = {'description': forms.Textarea(attrs={'cols': 80})}

url.py:

urlpatterns = [
# Home Page [[ ^$ = stringa vuota ]]
url(r"^$", views.index, name="index"),
url(r"^servizi/$", views.servizi, name="servizi"),


url(r"^catering/$", views.catering, name="catering"),
url(r"^eventi_degustazioni/$", views.eventi_degustazioni, name="eventi_degustazioni"),
url(r"^academy/$", views.academy, name="academy"),

url(r"^corsi/$", views.corsi, name="corsi"),
url(r'^corsi/(?P<corso_id>\d+)/$', views.corso, name='corso'),


url(r"^shop/$", views.shop, name="shop"),
url(r"^chi_siamo/$", views.chi_siamo, name="chi_siamo"),
url(r"^lavora_con_noi/$", views.lavora_con_noi, name="lavora_con_noi"),


url(r"^spazio_utenti/$", views.spazio_utenti, name="spazio_utenti"),
url(r'^posts/$', views.post, name="posts"),
url(r'^posts/(?P<post_id>\d+)/$', views.post, name='post'),
url(r'^nuovo_post/$', views.nuovo_post, name="nuovo_post"),
url(r'^modifica_post/(?P<post_id>\d+)/$', views.modifica_post, name='modifica_post'),

] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

最佳答案

当用户尚未登录您的网站时。 request.userAnonymousUser 的实例。该实例没有 id。因此,模型中的owner_id字段变为空,这是数据库约束不允许的。尝试这样的事情:

def nuovo_post(request):

    if request.user.is_authenticated():
        if request.method != 'POST':
            # No data submitted; create a blank form.
            form = PostForm()
        else:
            # POST data submitted; process data.
            form = PostForm(request.POST)
            if form.is_valid():
                n_post = form.save(commit=False)
                n_post.owner = request.user
                n_post.save()
                return HttpResponseRedirect(reverse('learning_logs:posts'))
        context = {'form': form}
        return render(request, 'learning_logs/nuovo_post.html', context)
    else :
        return HttpResponseRedirect('/login/')

注意重定向到适当的登录网址

IntegrityError at /n_post/ NOT NULL constraint failed: learning_logs_post.owner_id

对于您提出的问题,这个答案基本上是正确的。但您的更新表明您的错误与您发布的代码无关。 (此代码会产生相同的错误,但您看到的错误是针对其他地方的类似代码)。

以下行显示 nuovu_post 未映射到错误中的网址。

url(r'^nuovo_post/$', views.nuovo_post, name="nuovo_post"),

关于python - Django ModelForm 不保存在数据库上创建帖子的用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41946504/

相关文章:

python - 最简单的 django 定时/计划任务(例如 : reminders)?

python - 设置或更改类的属性时如何在 Django 中设置时间戳

python - 如何正确删除特定的 ManyToMany 关系?

python - 如何使用 django formset 动态删除对象

python - 了解 Flask 请求对象

python - Keras属性错误: 'NoneType' object has no attribute 'endswith' in load_model

python - 比较python中三个列表的长度

python - Django 表单 as_table(), as_p() 方法不起作用

html - django 表格 : styling widget when field is required or has an error

python - 在数字前后添加空格(正则表达式)