Django 填充选择字段

发布于 2024-12-11 17:30:32 字数 1733 浏览 0 评论 0原文

我正在使用四个表:

class Product(models.Model):
    active = models.BooleanField(default=True)
    name = models.CharField(max_length=40, unique=True)
    acronym = models.CharField(max_length=3, unique=True)

class Alarm(models.Model):
    active = models.BooleanField(default=True)
    product = models.ForeignKey(Product) #NEW
    name = models.CharField(unique=True, max_length=35)
    image_file = models.CharField(max_length=30)

class File(models.Model):
    reference = models.CharField(max_length=40)
    product = models.ForeignKey(Product, related_name='item_product') #NEW
    created = models.DateTimeField(default=datetime.now)
    created_by = models.ForeignKey(User)

class FileAlarm(models.Model):
    file = models.ForeignKey(File)
    created = models.DateTimeField()
    created_by = models.ForeignKey(User, related_name="alarm_created_by")
    alarm_date = models.DateField(default=datetime.now)
    alarm_type = models.ForeignKey(Alarm)
    alarm_comment = models.CharField(max_length=80, blank=True, null=True)

不幸的是,我需要将 onChange 事件传递给 FileAlarm.alarm_type 的表单元素(这意味着 queryset __init__ 不起作用),所以我需要填充 ChoiceFieldchoices= 变量。我只是想知道如何做到这一点,因为我只想要活动并链接到与文件相同的产品的警报, FileAlarm 已链接。

class FileAlarmForm(ModelForm):

    def __init__(self,file,*args,**kwargs):
        super(FileAlarmForm, self).__init__(*args, **kwargs)
        self.fields['alarm'].queryset = Alarm.objects.filter(product__id=file.product_id)

    alarm_type = ChoiceField(required=True, widget=Select(attrs={'onChange':'updateAlarmImage'}))  # << ?!?

I am working with four tables:

class Product(models.Model):
    active = models.BooleanField(default=True)
    name = models.CharField(max_length=40, unique=True)
    acronym = models.CharField(max_length=3, unique=True)

class Alarm(models.Model):
    active = models.BooleanField(default=True)
    product = models.ForeignKey(Product) #NEW
    name = models.CharField(unique=True, max_length=35)
    image_file = models.CharField(max_length=30)

class File(models.Model):
    reference = models.CharField(max_length=40)
    product = models.ForeignKey(Product, related_name='item_product') #NEW
    created = models.DateTimeField(default=datetime.now)
    created_by = models.ForeignKey(User)

class FileAlarm(models.Model):
    file = models.ForeignKey(File)
    created = models.DateTimeField()
    created_by = models.ForeignKey(User, related_name="alarm_created_by")
    alarm_date = models.DateField(default=datetime.now)
    alarm_type = models.ForeignKey(Alarm)
    alarm_comment = models.CharField(max_length=80, blank=True, null=True)

Unfortunatly I need to pass an onChange event to the form element of FileAlarm.alarm_type (which means the queryset in __init__ wont work) so I need to populate the choices= variable of ChoiceField. I'm just wondering how to do that since I only want alarms that are active and linked to the same products as the File which the FileAlarm is linked.

class FileAlarmForm(ModelForm):

    def __init__(self,file,*args,**kwargs):
        super(FileAlarmForm, self).__init__(*args, **kwargs)
        self.fields['alarm'].queryset = Alarm.objects.filter(product__id=file.product_id)

    alarm_type = ChoiceField(required=True, widget=Select(attrs={'onChange':'updateAlarmImage'}))  # << ?!?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

榕城若虚 2024-12-18 17:30:32

事实证明最好的解决办法是:

class FileAlarmForm(ModelForm):

    def __init__(self,file,*args,**kwargs):
        super(FileAlarmForm, self).__init__(*args, **kwargs)
        p = Product.objects.get(id=file.product_id)
        self.fields['alarm_type'].widget = Select(attrs={'onchange':'updateAlarmImage'})
        self.fields['alarm_type'].queryset = Alarm.objects.filter(product=p)

It turns out the best way round it was:

class FileAlarmForm(ModelForm):

    def __init__(self,file,*args,**kwargs):
        super(FileAlarmForm, self).__init__(*args, **kwargs)
        p = Product.objects.get(id=file.product_id)
        self.fields['alarm_type'].widget = Select(attrs={'onchange':'updateAlarmImage'})
        self.fields['alarm_type'].queryset = Alarm.objects.filter(product=p)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文