通过init在modelForm中初始化值

问题描述 投票:0回答:1

可能是我试图以错误的方式解决这个问题。但如果有人对如何解决这个问题有好主意,我会洗耳恭听。

我想要实现的目标。我有一个带有 Charfield 的模型,我用另一个模型中的字段中的数据填充该模型。由于不同的原因,ForeignField 对我来说不是一个选择。因此,我定义数据,以便从模型表单的初始化过程中进行选择。建立一个可供选择的列表非常有效。我尝试简化下面的代码。

class myModel(model.Models)
   troop = models.CharField(......)
   stuff = models.CharField(......)
   camp = models.SlugField(......)
   def __str__(self):
        return self.troop

class mySecondModel(model.Models)
   name = models.CharField(......)
   other_stuff = models.CharField(......)
   slug = models.SlugField(......)
   camp = models.SlugField(......)
   def __str__(self):
        return self.slug

class View_Troop(UpdateView):
    template_name = 'troop.html'
    model = myModel
    form_class = myModel_form

    def get_form_kwargs(self):
        id_ = self.kwargs.get('id')           #//'id' = troop #
        obj= myModel.objects.filter(troop=id_)
        kwargs = super(View_Troop, self).get_form_kwargs()
        kwargs.update({'troop': obj.troop})
        kwargs.update({'camp': obj.camp})
        return kwargs


class myModel_form(forms.ModelForm)
    stuff = ModelChoiceField(queryset= mySecondModel.objects.all())

    class Meta:
        model = myModel
        fields = '__all__'
      
    def __init__(self, *args, **kwargs):
        troop = kwargs.pop('troop')
        camp = kwargs.pop('camp')
        variable_1= .... function based on troop value
        super(myModel_form, self).__init__(*args, **kwargs)  
        self.fields['stuff'].queryset=mySecondModel.objects.filter(other_stuff__contains= variable_1, camp=camp)
        self.fields['stuff'].label_from_instance = lambda obj: "%s - %s" % (obj.name, obj.other_stuff)
        

但是我还没有弄清楚如何在表单中预先选择当前值(初始值)。有什么提示吗?

django initialization modelform
1个回答
0
投票

您可以使用表单实例的

initial
参数预先选择字段值。在 UpdateView 中,重写
get_initial
方法,该方法返回
field_name:value
的字典。

def get_initial(self):
    return {"stuff": "whatever value from your select options"} 

或者,如果初始值始终相同,您可以简单地为

initial
提供一个
UpdateView
属性:

class View_Troop(UpdateView):
    initial = {"stuff": "value"} 
    ... 

不过我很好奇,为什么

ForeignKey
字段不适合您?这似乎是外键的好地方。正如文档所述:

请注意,选择可以是任何序列对象——不一定是列表或元组。这使您可以动态地构建选择。但是,如果您发现自己的黑客选择是动态的,那么您最好使用带有外键的正确数据库表。选择适用于不会发生太大变化(如果有的话)的静态数据。

© www.soinside.com 2019 - 2024. All rights reserved.