2017-06-20 80 views
0

我有以下的模型和形式:编辑Django模型的查询集

# Model 
class Fruit(...): 
    name = models.CharField(...)  # Default name of the fruit 
    engName = models.CharField(...) # English name 

    def __str__(self): 
     return self.name 


# Form 
class ComboProductForm(forms.ModelForm): 
    fruit = forms.ModelChoiceField(queryset=Fruit.objects.none()) 

    def __init__(self, *args, **kwargs): 
     branch = kwargs.pop('branch') 
     fruits = Fruit.objects.filter(branch=branch) # Branch of the company 
     self.fields['fruit'].queryset = fruits 

在公司的每个分支都有不同的水果,所以我在__init__方法来筛选水果。我想是根据request.LANGUAGE_CODE修改查询集:

def __init__(self, *args, **kwargs): 
     branch = kwargs.pop('branch') 
     language = kwargs.pop('language') 
     fruits = Fruit.objects.filter(branch=branch) # Branch of the company 
     if language == 'en': 
      for fruit in fruits: 
       fruit.name = fruit.engName 
     self.fields['fruit'].queryset = fruits 

也就是说,显示英文名字的水果,如果在语言代码是英语。但是,由此产生的fruits的内容似乎没有改变。我该如何修改查询集?

我也曾尝试以下操作:

fruits = list(fruits) 
for fruit in fruits: 
    fruit.name = fruit.engName 

但后来我不得不fruits转换回查询集类型。我该怎么做,并将这项工作?

我也想在模型方法__str__返回不同的领域:

def __str__(self): 
    if language_code == 'English': # Hypothetical statement 
     return self.name 
    return self.engName 

但不知道该怎么做。请帮助和谢谢。

回答

1

由拉吉的启发,我想出了以下解决方案:

def __init__(self, *args, **kwargs): 
    branch = kwargs.pop('branch') 
    language = kwargs.pop('language') 
    fruits = Fruit.objects.filter(branch=branch) # Branch of the company 
    self.fields['fruit'].queryset = fruits 
    if language == 'en': 
     self.fields['fruit'].label_from_instance = lambda obj: "%s" % obj.engName 
+1

这个方法更简单,更好 –

1

试试这个:

class ComboProductForm(forms.ModelForm): 
    fruit = forms.ModelChoiceField(queryset=Fruit.objects.none()) 

    def __init__(self, *args, **kwargs): 
     branch = kwargs.pop('branch') 
     language = kwargs.pop('language') 
     fruits = Fruit.objects.filter(branch=branch) # Branch of the company 
     self.fields['fruit'].queryset = fruits 
     self.fields['fruit'].label_from_instance = self.label_from_instance(language) 

    @staticmethod 
    def label_from_instance(obj, language): 
     if language == 'en': 
      return obj.engName 
     return obj.name 
+0

以下是错误消息:'label_from_instance()失踪1个人需要的位置参数:“语言' –