ModelForm 根据最后一个条目的主要 ID 添加 table 中条目的主要 ID
ModelForm add the primary ID for an entry in table based on last entry's primary ID
我正在创建一个注册系统。我正在使用 django 的默认用户模型来存储用户详细信息,并将其对象传递到名为“Employee”的模型中,其中存储了他们的部门、经理和其他信息。这是我的。
models.py:
from django.contrib.auth.models import User
class Employee(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='user')
....
forms.py:
from users.models import Employee
from django.contrib.auth.models import User
from django.forms import ModelForm
from django.contrib.auth.forms import UserCreationForm
class AddNewUserForm(UserCreationForm):
class Meta:
model = User
fields = ('username', 'first_name', 'last_name', 'email', 'password1', 'password2')
class AddNewEmployeeForm(ModelForm):
class Meta:
model = Employee
fields = {'department', 'manager', 'total_leaves'}
add_new_user.html:
<form method="POST">
{% csrf_token %}
{{ form_user.as_p }}
{{ form_emp.as_p }}
<div class="text-center">
<button type="submit" class="btn btn-success">Submit</button>
</div>
</form>
这就是我在 views.py 中处理数据的方式:
class AddNewUser(TemplateView):
template_name = 'LMSAdmin/add_new_user.html'
def get(self, request, *args, **kwargs):
form_user = AddNewUserForm()
form_emp = AddNewEmployeeForm()
return render(request, self.template_name, {'form_user': form_user, 'form_emp': form_emp})
def post(self, request):
form_user = AddNewUserForm(request.POST)
form_emp = AddNewEmployeeForm(request.POST)
if form_user.is_valid():
emp_info = form_emp.save(commit=False)
emp_info.leaves_taken = 0
emp_info.user = form_user.save()
emp_info.save()
messages.success(request, "Success!")
else:
messages.error(request, form_user.errors)
messages.error(request, form_emp.errors)
return redirect("add_new_user")
问题是当post方法是运行时,它试图从头开始向Employee
table添加条目;假设其中没有条目。但是我在 table 中有条目,但出现以下错误:
duplicate key value violates unique constraint "users_employee_pkey"
DETAIL: Key (id)=(6) already exists.
它给了我这个错误,因为我的 table 中已经有 6 个用户。在此之后,当我第 7 次尝试使用此表单创建用户时,它起作用了。有没有办法查看 table 中已经有多少条目并自动将其递增 1 以避免此错误?
您可以手动设置自己的主键字段
class Employee(models.Model):
employee_id = models.IntegerField(primary_key=True)
然后你就可以在保存过程中计算并设置主键了。只需获取最大值的条目。 employee_id 并将其递增 1。例如:
from django.db.models import Max
# double underscores in employee_id__max
max_employee_id = Employee.objects.all().aggregate(Max('employee_id'))['employee_id__max']
我正在创建一个注册系统。我正在使用 django 的默认用户模型来存储用户详细信息,并将其对象传递到名为“Employee”的模型中,其中存储了他们的部门、经理和其他信息。这是我的。
models.py:
from django.contrib.auth.models import User
class Employee(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='user')
....
forms.py:
from users.models import Employee
from django.contrib.auth.models import User
from django.forms import ModelForm
from django.contrib.auth.forms import UserCreationForm
class AddNewUserForm(UserCreationForm):
class Meta:
model = User
fields = ('username', 'first_name', 'last_name', 'email', 'password1', 'password2')
class AddNewEmployeeForm(ModelForm):
class Meta:
model = Employee
fields = {'department', 'manager', 'total_leaves'}
add_new_user.html:
<form method="POST">
{% csrf_token %}
{{ form_user.as_p }}
{{ form_emp.as_p }}
<div class="text-center">
<button type="submit" class="btn btn-success">Submit</button>
</div>
</form>
这就是我在 views.py 中处理数据的方式:
class AddNewUser(TemplateView):
template_name = 'LMSAdmin/add_new_user.html'
def get(self, request, *args, **kwargs):
form_user = AddNewUserForm()
form_emp = AddNewEmployeeForm()
return render(request, self.template_name, {'form_user': form_user, 'form_emp': form_emp})
def post(self, request):
form_user = AddNewUserForm(request.POST)
form_emp = AddNewEmployeeForm(request.POST)
if form_user.is_valid():
emp_info = form_emp.save(commit=False)
emp_info.leaves_taken = 0
emp_info.user = form_user.save()
emp_info.save()
messages.success(request, "Success!")
else:
messages.error(request, form_user.errors)
messages.error(request, form_emp.errors)
return redirect("add_new_user")
问题是当post方法是运行时,它试图从头开始向Employee
table添加条目;假设其中没有条目。但是我在 table 中有条目,但出现以下错误:
duplicate key value violates unique constraint "users_employee_pkey" DETAIL: Key (id)=(6) already exists.
它给了我这个错误,因为我的 table 中已经有 6 个用户。在此之后,当我第 7 次尝试使用此表单创建用户时,它起作用了。有没有办法查看 table 中已经有多少条目并自动将其递增 1 以避免此错误?
您可以手动设置自己的主键字段
class Employee(models.Model):
employee_id = models.IntegerField(primary_key=True)
然后你就可以在保存过程中计算并设置主键了。只需获取最大值的条目。 employee_id 并将其递增 1。例如:
from django.db.models import Max
# double underscores in employee_id__max
max_employee_id = Employee.objects.all().aggregate(Max('employee_id'))['employee_id__max']