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 中的主要内容,如果未能解决你的问题,请参考以下文章

保存时复制数据库中的数据(Django 表单)

Django 中的内联表单验证

Django - CreateView 不使用嵌套表单集保存表单

在 Django 中使用自定义外键字段保存表单中的数据

不使用 django 表单如何验证和保存表单数据

通过 Django 中的模型表单保存多对多数据