Django 后台管理系统model数据刷新问题
现在有数据表如下,表中有字段是根据其他表来填写的,我做了一个choices来做下拉框,可是现在有问题就是用户新注册后,地址栏没有数据,重启django后地址栏才会有数据
# 用户表
class Userinfo(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=16, verbose_name='名字')
code = models.CharField(max_length=16, verbose_name='工号', null=True, blank=True, unique=True)
password = models.CharField(max_length=88, verbose_name='密码')
isenable = models.BooleanField(default=False, verbose_name='是否启用')
try:
choices = [(i.ID, i.getaddressname) for i in addresschildren.objects.all()]
except Exception as e:
print(e)
choices = []
address_id = models.IntegerField(verbose_name='用户注册地', null=True, blank=True, choices=choices)
try:
choices = [(i.ID, i.Name) for i in address.objects.all()]
except:
choices = []
super_address_id = models.IntegerField(verbose_name='用户管理范围', null=True, blank=True, choices=choices)
config = configparser.ConfigParser()
try:
config.read(configsys.objects.get(name="config").value)
except ObjectDoesNotExist:
path = r'apps/config/config.ini'
config.read(path)
except Exception:
path = r'apps/config/config.ini'
config.read(path)
choices = [(int(i[-1]), i[0]) for i in config.items('jurisdiction')]
super_number = models.IntegerField(verbose_name='用户管理权限', null=True, blank=True, choices=choices, default=1)
新地址,新用户,地址栏无显示
下拉菜单也无法找到刚刚注册的地址
重启django后
请问该如何让django数据库中数据更新后能实时拿到数据并在这个方法中显示
参考:
python - Dynamic choices field in Django Models - Stack Overflow
My models.py:
SHOP1_CHOICES = (
('Food Court', 'Food Court'),
('KFC', 'KFC'),
)
SHOP2_CHOICES = (
('Sports Arena', 'Sports Arena'),
('Disco D', 'Disco D'),
)
SHOP3_CHOICES = (
...
https://stackoverflow.com/questions/6001986/dynamic-choices-field-in-django-models/12005426#12005426
可以试试在Userinfo类下建立 init 构造方法
这样好像在每次调用都会根据另一个数据表刷新choices
class Userinfo(models.Model):
...
...
def __init__(self, *args, **kwargs):
super(Userinfo, self).__init__(*args, **kwargs)
self._meta.get_field('address_id').choices = addresschildren.objects.all().values_list('field_name','field_name')
choices = [(i.ID, i.getaddressname) for i in addresschildren.objects.all()]
这样的代码可以看出,问题非常大,我不知道你是在哪学习Django的,如果需要帮助的话可以加我,我从15年开始使用Django,而且为DRF框架贡献过代码。
class内的代码定义了model,没错,但是这样的定义代码【只在Python运行的时候执行1次】
比如第九行choices = [(i.ID, i.getaddressname) for i in addresschildren.objects.all()]
Django刚启动时候choices有多少,后面就永远有多少,除非重新启动,【重新执行这一行】
在没有重启的时候,通过网页添加了多少addresschildren
,都不会【动态更新】
这种数据表的关联关系,Django 有专门的用法,比如ForeignKey、ManyToManyRel
class Address(models.Model):
detail = models.CharField("详细地址", max_length=200, default="")
def __str__(self):
return self.detail
# 用户表
class Userinfo(models.Model):
name = models.CharField("昵称", max_length=200)
address = models.ForeignKey(Address, related_name="地址", on_delete=models.DO_NOTHING) # 关联另一个model
效果如下,关键是 【下拉选择框的内容,会根据数据库的情况,实时变化】
最后再多说一点
为什么要用class定义model?
因为class映射是数据表,object映射数据表中的数据,也就是说数据应该是一个个的object,而不是class
model应该只定义数据的scheme,而无关具体的值