【问题标题】:Taking user input and using it to identify appropriate ForeignKey in Django接受用户输入并使用它在 Django 中识别适当的 ForeignKey
【发布时间】:2023-03-15 19:01:01
【问题描述】:

所以我有这个作为我的views.py:

from django.shortcuts import render, redirect
from django.contrib.auth import login, authenticate, logout
from account.forms import RegistrationForm, AccountAuthenticationForm, AccountUpdateForm
from framework.models import Company

# Create your views here.

def registration(request):
  context = {}
  
  user = request.user
  if user.is_authenticated:
    return redirect("index")
  if request.POST:
    updated_request = request.POST.copy()
    for entity in Company.objects.all():
      if entity in Company.objects.all():
        updated_request['company'] = Company.objects.get_or_create(entity)[0]
          form = RegistrationForm(updated_request)

    if form.is_valid():
      form.save()
      username = form.cleaned_data.get('username')
      email = form.cleaned_data.get('email')
      first_name = form.cleaned_data.get('first_name')
      last_name = form.cleaned_data.get('last_name')
      raw_password = form.cleaned_data.get('password1')
      address1 = form.cleaned_data.get('address1')
      address2 = form.cleaned_data.get('address2')
      city = form.cleaned_data.get('city')
      state = form.cleaned_data.get('state')
      zipcode = form.cleaned_data.get('zipcode')
      account = authenticate(username=username,password=raw_password)
      return redirect('index')
    else:
      context['registration_form'] = form
  else:
    form = RegistrationForm()
    context['registration_form'] = form
  return render(request, 'account/register.html' , context)

我正在尝试以文本形式获取用户的输入并将其与数据库进行比较以选择他们正在工作的公司,我还将添加一个 else 语句,如果该语句是确切的还不存在。

我知道这意味着用户可以不断地创建新公司,但这不是问题,因为所有帐户在激活之前都会经过人工审核,所以如果有人打错或与确切命名略有偏差,我们正在为他们的公司使用它会在出现任何错误之前被捕获。

至于我的模型,这是他们的代码:

account/models.py

from framework.models import Company
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager

# ...

class Account(AbstractBaseUser):
    username = models.CharField(max_length=32, unique=True)
    email = models.EmailField(verbose_name='email', max_length=64, unique=True)
    first_name = models.CharField(max_length=32)
    last_name = models.CharField(max_length=32)
    address1 = models.CharField(max_length=512)
    address2 = models.CharField(max_length=64, blank=True)
    city = models.CharField(max_length=128)
    state = models.CharField(max_length=8)
    zipcode = models.CharField(max_length=5)
    country = models.CharField(max_length=128, default="US")
    company = models.ForeignKey(Company,related_name="employees",null=True,blank=True,on_delete=models.CASCADE)
    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=False)
    is_staff = models.BooleanField(default=False)
    is_superuser = models.BooleanField(default=False)


    USERNAME_FIELD = 'username'
    REQUIRED_FIELDS = ['email','company', 'first_name','last_name', 'address1', 'city', 'state', 'zipcode']

    objects = MyAccountManager()


    def __str__(self):
        return self.username

    def has_perm(self, perm, obj=None):
        return self.is_admin

    def has_module_perms(self, app_label):
        return True

framework/models.py

class Company(models.Model):

    name = models.CharField(max_length=256)

    def __str__(self):
        return self.name

因此,我需要帮助将它放到用户可以输入公司名称的位置,它会搜索现有公司的列表,并将其公司设置为现有公司或创建新公司。

我收到的主要错误代码是:无法分配"'Company object (1)'": "Account.company" must be a "Company" instance.

如果您需要任何其他信息,请通过我的方式发送消息。

【问题讨论】:

    标签: python python-3.x django django-models django-forms


    【解决方案1】:

    您不需要在此处循环遍历所有记录。

    for entity in Company.objects.all():
    

    Django 具有返回过滤器和搜索等的内置方法,无需在此处循环 all()


    如果只需要name,您可以使用get_or_create() 指定传递给get_or_create() 时所需的字段,如下所示。

    obj, created = Company.objects.get_or_create(name=company)
    

    现在obj 将始终包含从您的数据库中创建或获取的行。然后只需设置updated_request['company']

    updated_request['company'] = obj.pk
    

    【讨论】:

    • 我已经尝试了您的建议,但收到此错误“无法解压缩不可迭代的公司对象”
    猜你喜欢
    • 1970-01-01
    • 2022-01-17
    • 2015-12-31
    • 1970-01-01
    • 1970-01-01
    • 2021-07-19
    • 1970-01-01
    • 2011-01-09
    • 1970-01-01
    相关资源
    最近更新 更多