python - 为什么表格没有保存到数据库中?
问题描述
我已经卡在这个问题上一段时间了,似乎无法解决这个问题。我已经检查了代码一百次,但显然我遗漏了一些东西。我有 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"),
解决方案
你需要在你的 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', {})