当我在 Django 项目中创建对象时,正确的值没有保存在数据库中

问题描述 投票:0回答:1

我正在编写一个在组织之间共享的基本 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 %}

除了组织名称之外,一切都按预期进行 - 组织管理团队的名称记录在数据库中,而不是在表单中输入的组织名称。 请帮忙。预先感谢。

django django-models django-views django-forms django-templates
1个回答
0
投票

问题似乎出在您的模板文件中

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>

© www.soinside.com 2019 - 2024. All rights reserved.