django 中的表单不保存在 Psql 中
Posted
技术标签:
【中文标题】django 中的表单不保存在 Psql 中【英文标题】:Form in django not saving in Psql 【发布时间】:2020-09-14 14:21:09 【问题描述】:我是 Django 新手,这是我的第一个项目。
我想允许用户对其他用户的帖子投赞成票/反对票。我有一个模型。
我使用 postgresql 作为数据库,我能够为每个用户创建用户和帖子,但是当我在模型 Django 中添加以下投票字段时:
upVote = models.ManyToManyField(User, related_name="upvote")
downVote = models.ManyToManyField(User, related_name="downvote")
它刚刚停止在数据库中保存用户帖子。它没有显示任何错误,它
只是不保存。
模型.py
from django.db import models
from django.contrib.auth.models import User
# Create your models here.
from django.conf import settings
class UserPost(models.Model):
user = models.ForeignKey(User,
default=1,
null=True,
on_delete=models.SET_NULL
)
title = models.CharField(max_length=250, blank=False)
description = models.CharField(max_length=500, blank=False)
images = models.ImageField(
upload_to='post_pictures/', null=True, blank=True)
videos = models.FileField(upload_to='post_videos/', null=True, blank=True)
upVote = models.ManyToManyField(User, related_name="upvote")
downVote = models.ManyToManyField(User, related_name="downvote")
在 view.py 中登录和注册工作,但因为我想显示所有的帖子 索引我什么也没看到。 Bc DB 是空的。
@login_required(login_url='/login-page/')
def personalPage(request):
form = FormPost(request.POST, request.FILES)
if request.method == 'POST':
if form.is_valid():
post = form.save(commit=False)
post.user = request.user
post.save()
messages.success(request, "Successfully created")
return render(request, 'accounts/personal-page.html', 'form': form)
def registerPage(request):
if request.user.is_authenticated:
return redirect("personalPage")
else:
form = RegisterForm()
if request.method == 'POST':
form = RegisterForm(request.POST)
if form.is_valid():
user = form.save()
username = form.cleaned_data.get('username')
email = form.cleaned_data.get('email')
password = form.cleaned_data.get('password')
password2 = form.cleaned_data.get('password2')
return redirect("personalPage")
context = 'form': form
return render(request, 'accounts/register-page.html', context)
def loginPage(request):
if request.user.is_authenticated:
return redirect('personalPage')
else:
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
user = authenticate(request, username=username, password=password)
if user is not None:
login(request, user)
return redirect('personalPage')
else:
messages.info(
request, 'Username OR password is incorrect')
return render(request, 'accounts/login-page.html')
url.py
from django.urls import path
from django.conf.urls.static import static
from django.conf import settings
from . import views
urlpatterns = [
path('', views.index, name='index'),
path('register-page/', views.registerPage, name='registerPage'),
path('login-page/', views.loginPage, name='loginPage'),
path('logout/', views.logOutButton, name='logOut'),
path('personal-page/', views.personalPage, name='personalPage'),
]
if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL,
document_root=settings.MEDIA_ROOT)
表单模板
%extends 'accounts/base.html'%% load static %%block content%
<div style="text-align: center;">
<h1>Personal page</h1>
<a class="nav-link" href="% url 'logOut' %">LogOut</a>
<br />
<br />
<form method="POST" enctype="multipart/form-data">
% csrf_token %<br />
<hr />
<br />
<p>Title :</p>
<br />
form.title
<br />
<hr />
<br />
<p>Movie's extract:</p>
<br />
form.videos
<br />
<p>Movie's picture:</p>
<br />
form.images<br />
<br />
<hr />
<p>Description :</p>
<br /><br />
form.description <br />
<br />
<br />
<hr />
<input type="submit" name="Register Account" />
</form>
</div>
%endblock%
索引模板。
% extends 'accounts/base.html'% % load static %% block content%
<h1>
Landing page
</h1>
<!-- Nav bar -->
<section class="index" style="text-align: center;">
<div class="user-post">
% for post in posts%
<p>post.user</p>
<p>post.title</p>
<br />
<p></p>
<br />
<p>Videos</p>
<br/>
%if post.videos %
<video controls autoplay>
<source src="post.videos.url" type="video/mp4"> </source>
</video>
% endif %
<br />
<p>Images</p>
<br/>
% if post.images %
<img src=" post.images.url " />
% endif %
<hr>
%endfor%
<br/>
<br/>
</div>
</section>
% endblock%
form.py
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User
from django import forms
from django.forms import ModelForm, Textarea, TextInput, ImageField, TypedChoiceField
from . models import UserPost
class RegisterForm(UserCreationForm):
class Meta:
model = User
fields = ['username', 'email', 'password1', 'password2']
class FormPost(forms.ModelForm):
class Meta:
model = UserPost
fields = ['title', 'description', 'images',
'videos', 'upVote', 'downVote']
widgets =
'title': TextInput(attrs='class': 'title', 'placeholder': 'Title'),
'description': Textarea(attrs='class': 'textarea', 'rows': 10, 'placeholder': 'Description')
我怀疑我的模型不适合 Psql。但我不确定。
【问题讨论】:
您的所有字段都可以在所有支持的数据库中使用。因为您没有使用特定的数据库字段..所以问题不在您的模型上。 【参考方案1】:向数据库添加新字段后,您需要进行迁移,然后进行迁移,以便新的更改生效。
python manage.py makemigrations
python manage.py migrate
【讨论】:
我做了几次python manage.py makemigrations python manage.py migrate
但还是不行。
在您的 form.py 中,class FormPost(forms.ModelForm):
应该是 class PostForm(forms.ModelForm):
。我不知道这是否会有所作为,但您是否尝试过使用 python 调试器?这应该可以帮助您在执行代码时检查它,这可以帮助我们找出您的代码没有按预期工作的地方。以上是关于django 中的表单不保存在 Psql 中的主要内容,如果未能解决你的问题,请参考以下文章