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