You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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>

关键说明

  1. 用ForeignKey替代CharField+choices,既能动态获取最新客户列表,又能直接关联客户的所有数据,是Django中模型关联的标准做法。
  2. 若不需要在Faktura表中存储NIP,可直接删除NIP字段,在模板或视图中通过{{ form.instance.klient.nip }}获取显示即可。

内容的提问来源于stack exchange,提问作者Sadek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 17:39:40