为什么不将表单保存到数据库中?

问题描述

我已经坚持了一段时间,似乎无法解决此问题。我已经检查了一百次代码,但是显然我缺少了一些东西。 我有1个用于创建新用户的表单,将所有内容连接到数据库(Postgresql),但是该表单没有保存。我正在尝试创建新用户,然后在成功时将其呈现到users.html中 有人可以说我想念的吗?

models.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) 

forms.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")

views.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,{})
else:
    return render(request,'useradd.html',{
        'form': AccountForm(),})

Settings.py:

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

useradd.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 %}

urls.py

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

解决方法

您需要在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,{})