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

时间:2020-10-26 09:53:23

标签: python postgresql django-forms django-2.2

我已经坚持了一段时间,似乎无法解决此问题。我已经检查了一百次代码,但是显然我缺少了一些东西。 我有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, 'users.html', {})
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"), 

1 个答案:

答案 0 :(得分:0)

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