我正在编写一个在组织之间共享的基本 Django CRM 项目。超级用户创建新组织时,必须设置组织名称、组织所有者和组织管理团队。
我还附上相关代码:
组织模型.py
class Organization(models.Model):
name = models.CharField(
max_length=255,
unique=True,
)
owner = models.OneToOneField(
User,
on_delete=models.CASCADE
)
members = models.ManyToManyField(
User,
related_name='organizations',
)
created_at = models.DateTimeField(
auto_now_add=True
)
updated_at = models.DateTimeField(
auto_now=True
)
def __str__(self):
return self.name
团队模型.py
class Team(models.Model):
name = models.CharField(
max_length=255
)
created_by = models.ForeignKey(
User,
related_name='created_by',
on_delete=models.CASCADE,
)
organization = models.ForeignKey(
Organization,
on_delete=models.CASCADE
)
created_at = models.DateTimeField(
auto_now_add=True
)
updated_at = models.DateTimeField(
auto_now=True
)
def __str__(self):
return self.name
用户模型.py
class User(AbstractUser):
username = None
email = models.EmailField(
_("email address"),
unique=True,
validators=[
validators.EmailValidator(),
]
)
team = models.ForeignKey(
'team.Team',
related_name='agents',
null=True,
blank=True,
on_delete=models.CASCADE
)
is_agent = models.BooleanField(default=True)
is_org_owner = models.BooleanField(default=False)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = []
objects = UserManager()
def __str__(self):
return self.email
class Meta:
verbose_name = 'CRM User'
verbose_name_plural = 'CRM Users'
视图.py
@login_required
@superuser_access
def add_organization(request):
if request.method == 'GET':
user_form = AddOrgOwnerForm()
organization_form = AddOrganizationForm()
team_form = AddTeamForm()
else:
user_form = AddOrgOwnerForm(request.POST)
organization_form = AddOrganizationForm(request.POST)
team_form = AddTeamForm(request.POST)
if user_form.is_valid() and organization_form.is_valid() and team_form.is_valid():
user = user_form.save()
organization = organization_form.save(commit=False)
team = team_form.save(commit=False)
user.is_staff = True
user.is_org_owner = True
user.is_agent = False
user.groups.add(1)
organization.owner = user
team.created_by = user
team.organization = organization
organization.save()
team.save()
organization.members.set([user])
user.team = team
user.password = make_password(f"{random.randint(0, 1000)}")
user.save()
reset_password_form = PasswordResetForm(data={'email': user.email})
if reset_password_form.is_valid():
reset_password_form.save(request=request)
messages.success(request, f'Organization {organization_form.cleaned_data["name"]} created successfully')
return redirect('organization_list')
context = {
'user_form': user_form,
'organization_form': organization_form,
'team_form': team_form,
}
return render(request, 'organizations/add_organization.html', context)
模板add_organization.html
{% extends "common/base.html" %}
{% load static %}
{% block title %}Add organization{% endblock %}
{% block content %}
<div class="flex justify-center items-center h-screen w-full bg-blue-100 font-light">
<div class="w-1/2 bg-white shadow-xl shadow-gray-700 p-8 m-4 rounded-xl">
<div class="justify-self-end">
<a href="{% url 'organization_list' %}"
class="justify-center bg-gray-500 hover:bg-green-900 text-white px-4 py-2 rounded-lg transition duration-200">
Back
</a>
</div>
<h1 class="block w-full text-center text-gray-800 text-2xl mb-6">Create organization</h1>
<form action="{% url 'add_organization' %}" method="post">
{% csrf_token %}
<div class="flex flex-col mb-4">
<label class="mb-2 text-lg text-gray-900" for="name">Organization Name</label>
{{ organization_form.name.errors|striptags }}
<input class="border py-2 px-3 text-grey-800 rounded-lg" type="text" name="name" id="name">
</div>
<div class="flex flex-col mb-4">
<label class="mb-2 text-lg text-gray-900" for="email">Organization Owner email</label>
{{ user_form.email.errors|striptags }}
<input class="border py-2 px-3 text-grey-800 rounded-lg" type="text" name="email" id="email">
</div>
<div class="flex flex-col mb-4">
<label class="mb-2 text-lg text-gray-900" for="name">Organization Admin Team Name</label>
{{ team_form.name.errors|striptags }}
<input class="border py-2 px-3 text-grey-800 rounded-lg" type="text" name="name" id="name">
</div>
<button class="block bg-blue-500 hover:bg-blue-800 text-white uppercase text-lg mx-auto p-4 rounded-lg"
type="submit">Create organization
</button>
</form>
</div>
</div>
{% endblock %}
除了组织名称之外,一切都按预期进行 - 组织管理团队的名称记录在数据库中,而不是在表单中输入的组织名称。 请帮忙。预先感谢。
问题似乎出在您的模板文件中
add_organization.html
在
<form>
标签中。两个 <input>
字段与相同的 name=name
属性发生冲突。
<div class="flex flex-col mb-4">
<label class="mb-2 text-lg text-gray-900" for="name">Organization Name</label>{{ organization_form.name.errors|striptags }}
<input class="border py-2 px-3 text-grey-800 rounded-lg" type="text" name="name" id="name">
</div>