Django ModelForm 不保存在数据库上创建帖子的用户
Django ModelForm not saving user that create posts on db
这里是 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)
models.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)
forms.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})}
urls.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.user
是 AnonymousUser
的实例。此实例没有 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/')
注意重定向到适当的登录 url
IntegrityError at /n_post/ NOT NULL constraint failed:
learning_logs_post.owner_id
对于您提出的问题,此答案基本上是正确的。但是您的更新显示您的错误与您发布的代码无关。 (此代码会产生相同的错误,但您看到的错误是针对其他地方的类似代码)。
以下行显示 nuovu_post 未映射到您的错误中的 url。
url(r'^nuovo_post/$', views.nuovo_post, name="nuovo_post"),
这里是 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)
models.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)
forms.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})}
urls.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.user
是 AnonymousUser
的实例。此实例没有 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/')
注意重定向到适当的登录 url
IntegrityError at /n_post/ NOT NULL constraint failed: learning_logs_post.owner_id
对于您提出的问题,此答案基本上是正确的。但是您的更新显示您的错误与您发布的代码无关。 (此代码会产生相同的错误,但您看到的错误是针对其他地方的类似代码)。
以下行显示 nuovu_post 未映射到您的错误中的 url。
url(r'^nuovo_post/$', views.nuovo_post, name="nuovo_post"),