Django模型数据联动问题:选择公司后自动填充税号
Django实现选择公司后自动填充税务识别号(NIP)的解决方案
一、修正模型设计(核心问题解决)
你当前的Faktura模型用CharField+静态choices存储客户名称,无法关联到Klient模型的NIP数据,且下拉选项不会随Klient表更新自动同步。正确做法是用ForeignKey关联Klient模型:
from django.db import models from .models import Klient # 确保导入Klient模型 class Faktura(models.Model): numer = models.CharField(max_length=260, blank=False, null=False, unique=True) # 关联Klient模型,on_delete根据业务需求调整(CASCADE表示客户删除时发票也删除) klient = models.ForeignKey(Klient, on_delete=models.CASCADE, related_name='faktury') # 若需在Faktura表中存储NIP,设置为只读;若无需存储,可直接通过klient.nip获取 NIP = models.CharField(max_length=260, editable=False) kwota_netto = models.FloatField(blank=False, null=True) VAT = models.FloatField(blank=False, null=True) kwota_brutto = models.FloatField(blank=False, null=True) # 保存时自动同步NIP到当前表 def save(self, *args, **kwargs): if self.klient: self.NIP = self.klient.nip # 假设Klient模型有名为nip的字段 super().save(*args, **kwargs)
二、更新表单配置
使用ModelForm自动生成关联下拉框,同时设置NIP输入框为只读:
# forms.py from django import forms from .models import Faktura class Faktura_Form(forms.ModelForm): class Meta: model = Faktura fields = ['numer', 'klient', 'NIP', 'kwota_netto', 'VAT', 'kwota_brutto'] widgets = { 'NIP': forms.TextInput(attrs={'readonly': 'readonly'}), }
三、添加AJAX接口视图
新增视图用于根据选中的客户ID返回对应NIP:
# views.py from django.http import JsonResponse from django.contrib.auth.decorators import login_required from .models import Klient @login_required def get_klient_nip(request): klient_id = request.GET.get('klient_id') if klient_id: try: klient = Klient.objects.get(id=klient_id) return JsonResponse({'nip': klient.nip}) except Klient.DoesNotExist: return JsonResponse({'nip': ''}) return JsonResponse({'nip': ''})
四、配置URL路由
在项目的urls.py中添加AJAX接口路由:
from django.urls import path from . import views urlpatterns = [ path('faktury/', views.Faktury, name='faktury'), path('get-klient-nip/', views.get_klient_nip, name='get_klient_nip'), ]
五、前端实现自动填充
在Faktury.html模板中添加JS代码,监听客户下拉框变化,调用接口填充NIP:
<!-- 引入jQuery(若项目已有则无需重复引入) --> <script src="https://code.jquery.com/jquery-3.6.4.min.js"></script> <script> $(document).ready(function() { // 监听客户下拉框的change事件 $('#id_klient').on('change', function() { const klientId = $(this).val(); if (klientId) { $.ajax({ url: "{% url 'get_klient_nip' %}", data: { 'klient_id': klientId }, dataType: 'json', success: function(response) { // 将返回的NIP填充到输入框 $('#id_NIP').val(response.nip); } }); } else { // 未选择客户时清空NIP输入框 $('#id_NIP').val(''); } }); }); </script>
关键说明
- 用
ForeignKey替代CharField+choices,既能动态获取最新客户列表,又能直接关联客户的所有数据,是Django中模型关联的标准做法。 - 若不需要在
Faktura表中存储NIP,可直接删除NIP字段,在模板或视图中通过{{ form.instance.klient.nip }}获取显示即可。
内容的提问来源于stack exchange,提问作者Sadek
相关产品推荐
相关产品推荐

