首页 > 解决方案 > 为什么表格没有保存到数据库中?

问题描述

我已经卡在这个问题上一段时间了,似乎无法解决这个问题。我已经检查了代码一百次,但显然我遗漏了一些东西。我有 1 个用于创建新用户的表单,将所有内容连接到数据库(PostgreSQL),但该表单不保存。我正在尝试创建新用户,然后当它成功时,将其呈现到 users.html 有人可以说我缺少什么吗?

模型.py

class Account(AbstractBaseUser):

    email                   = models.EmailField(verbose_name="email", max_length=60, unique=True)
    username                = models.CharField(max_length=30, unique=True)
    name                    = models.CharField(max_length=100)
    date_joined             = models.DateTimeField(verbose_name="date_joined", auto_now_add=True)
    last_login              = models.DateTimeField(verbose_name="last_login", auto_now=True)
    is_admin                = models.BooleanField(default=False)
    is_active               = models.BooleanField(default=True)
    is_staff                = models.BooleanField(default=False)
    is_superuser            = models.BooleanField(default=False)
    profile_image           = models.ImageField(max_length=255, upload_to=get_profile_image_filepath, null=True, blank=True, default=get_default_profile_image) 

表格.py

class AccountForm(UserCreationForm):

    email = forms.EmailField(max_length=255, help_text="Required. Add a valid email address")
    ROLE_CHOICES = (
        ('1', 'admin'),
        ('2', 'reception'),
        ('3', 'headofdepartment'),
        ('4', 'employee'),
        ('5', 'patient'),
        ('6', 'inactive'),
        )
    role = forms.ChoiceField(choices = ROLE_CHOICES)

    class Meta:
        model = Account
        fields = [
            'email', 
            'name',
            'role'
            ]
        labels = {
            'name': 'Име',
            'password': 'Парола',
            'role': 'Роля',
        }
    def clean_email(self):
        email = self.cleaned_data['email'].lower()
        try:
            account = Account.objects.get(email=email)
        except Exception as e:
            return email
        raise forms.ValidationError(f"Email {email} is already in used")

视图.py

def users(request):
     accounts = Account.objects.all()
     context = {'accounts': accounts}
     return render(request, 'users.html', context)
    
def users_add(request):
if request.method == 'POST':
    print(request.POST)
    form = AccountForm(request.POST)
    if form.is_valid():
        email = form.cleaned_data['email']
        name = form.cleaned_data['name']
        form = Account(email=email, name=name)
        form.save()
    return render(request, 'users.html', {})
else:
    return render(request, 'useradd.html', {
        'form': AccountForm(),
    })

设置.py:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'feedback',
        'USER': 'postgres',
        'PASSWORD': '****',
        'HOST': 'localhost',
        'PORT': '5432'
    }
}

用户添加.html

{% extends 'main.html' %}
{% load crispy_forms_tags %}

{% block content %}


    <div class="container">
        <div class="col-md-10.offset-md-1 mt-5">
          <div class="jumbotron">
            <h1 class="display-4">Добавяне на нов потребител</h1>
            <hr class="my-4">
             <form action="" method="post" autocomplete="off">
                {% csrf_token %}
                <table>
                {{ form.as_table }}
                  </table>
                <div class="row">
                  <div class="col-md-8">
                    <button type="submit" class="btn btn-success">Запиши <i class="far fa-save"></i></button>
                  </div>
                </div>
            </form>
          </div>
        </div>
      </div>


{% endblock content %}

网址.py

path('users/', views.users, name="users"), # Get request to retrieve and display users
path('users/add', views.users_add, name="useradd"), 

标签: pythonpostgresqldjango-formsdjango-2.2

解决方案


你需要在你的 useradd.html 标签中添加一些“动作”我认为你应该使用这个

<form action="{% url 'users_add' %}" method="post" autocomplete="off">

编辑:

试着让你的 views.py 看起来像这样:

def users_add(request):
    if request.method == 'POST':
        form = AccountForm(request.POST)
        if form.is_valid():
            form.save()
        return render(request, 'useradd.html', {})
    else:
        return render(request, 'users.html', {
            'form': AccountForm(),
        })

编辑 2:在保存之前尝试添加一些清洁。

def users_add(request):
    if request.method == 'POST':
        form = AccountForm(request.POST)
        if form.is_valid():
            email = form.cleaned_data['email']
            username = form.cleaned_data['username']
            name = form.cleaned_data['name']
            #Add all of the fields here and then add them bellow into the acc variable
            acc = Account(email=email, username=username, name=name)
            acc.save()
        return render(request, 'useradd.html', {})

推荐阅读