2017-06-20 2 views
0

Ich habe folgendes Modell und Form:bearbeiten queryset von django Modelle

# 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 

Jeder Zweig in der Firma verschiedene Früchte hat, so habe ich die Früchte in der __init__ Methode filtern. Was ich will, ist die queryset nach dem request.LANGUAGE_CODE zu ändern:

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 

Das heißt, anzuzeigen Englisch Fruchtnamen, wenn der Sprachcode ist Englisch. Der Inhalt der resultierenden fruits scheint jedoch nicht geändert. Wie ändere ich das Abfrage-Set?

Ich habe auch versucht, die folgenden:

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

Aber dann habe ich fruits zurück zu konvertieren Typ QuerySet. Wie mache ich das und wird das funktionieren?

Ich denke auch über die verschiedenen Felder im Modell Methode Rückkehr __str__:

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

haben aber keine Ahnung, wie das zu tun. Bitte helfen und danke.

Antwort

1

von Raj inspiriert, kam ich auf die folgende Lösung:

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

Dieser Ansatz ist einfacher und besser –

1

Versuchen Sie folgendes:

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

Hier ist die Fehlermeldung: 'label_from_instance() 1 erforderlich Positions Argument fehlt:‚Sprache ' –