可能是我试图以错误的方式解决这个问题。但如果有人对如何解决这个问题有好主意,我会洗耳恭听。
我想要实现的目标。我有一个带有 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)
但是我还没有弄清楚如何在表单中预先选择当前值(初始值)。有什么提示吗?
您可以使用表单实例的
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
字段不适合您?这似乎是外键的好地方。正如文档所述:
请注意,选择可以是任何序列对象——不一定是列表或元组。这使您可以动态地构建选择。但是,如果您发现自己的黑客选择是动态的,那么您最好使用带有外键的正确数据库表。选择适用于不会发生太大变化(如果有的话)的静态数据。