Django中实现账号查找功能:输入账号自动填充对应账户名
解答
首先你现有代码存在两处基础语法错误需要先修正:
Account模型的__str__方法中,返回值需要加self前缀,改为return self.account_nameAccountLookup模型的外键定义行末尾多了多余的冒号,需要删除
方案1(推荐):不需要单独定义account_name字段
按照数据库设计的第三范式,不建议在AccountLookup中冗余存储账户名字段,你已经通过account_number外键关联了Account模型,直接通过外键关联即可获取对应账户名,示例调用方式:
# 任意AccountLookup实例获取关联账户名的方式 lookup_obj = AccountLookup.objects.first() account_name = lookup_obj.account_number.account_name
该方案可以避免数据不一致问题(比如Account侧修改账户名后,冗余存储的字段没有同步更新导致的数据错误)。
方案2:确实需要冗余存储account_name的实现方式
如果业务场景必须要在AccountLookup表中存储账户名,字段定义如下,同时需要重写save方法实现自动填充:
class AccountLookup(models.Model): account_number = models.ForeignKey(Account, on_delete=models.CASCADE) # 字段参数和Account模型中的account_name保持一致,设置editable=False禁止手动修改 account_name = models.CharField(max_length=50, editable=False) def save(self, *args, **kwargs): # 保存时自动从关联的Account模型中取账户名赋值 self.account_name = self.account_number.account_name super().save(*args, **kwargs)
模板端自动填充功能的额外实现逻辑
要实现输入账号后自动填充账户名,仅修改模型无法满足需求,还需要补充前后端交互逻辑:
- 后端新增一个查询接口,接收账号参数,返回对应账户名,示例视图代码:
from django.http import JsonResponse from .models import Account def get_account_name(request): account_number = request.GET.get('account_number') try: account = Account.objects.get(account_number=account_number) return JsonResponse({'code': 200, 'account_name': account.account_name}) except Account.DoesNotExist: return JsonResponse({'code': 404, 'msg': '账号不存在'})
- 前端模板中添加JS逻辑,监听账号输入框的内容变化,发送AJAX请求获取账户名后回填到对应输入框即可。
内容的提问来源于stack exchange,提问作者Umar Milanzi Snr
相关产品推荐
相关产品推荐

