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