2010-01-26 11 views
2

Comment puis-je commander les options d'un champ de formulaire par champ traduit?django-multilingue: champ de liste déroulante par champs traduits

models.py:

class UserProfile(models.Model): 
    ... 
    country=models.ForeignKey('Country') 

class Country(models.Model): 
    class Translation(multilingual.Translation): 
     name = models.CharField(max_length=60) 
    ... 

template.html:

{# userprofileform is a standard modelform for UserProfile #} 
{{ userprofileform.country }} 

merci

modifier:

Je veux que les options du champ select à être commandé par name_de ou name_en selon la langue:

<!-- English --> 
<select> 
    <option>Afganistan</option> 
    <option>Austria</option> 
    <option>Bahamas</option> 
</select> 

<!-- German (as it is) --> 
<select> 
    <option>Afganistan</option> 
    <option>Österreich</option> 
    <option>Bahamas</option> 
</select> 

<!-- German (as it should be) --> 
<select> 
    <option>Afganistan</option> 
    <option>Bahamaas</option> 
    <option>Österreich</option> 
</select> 
+1

Pourriez-vous être plus précis? Que voulez-vous dire par "commander un champ par un autre champ"? Peut-être qu'un exemple pourrait aider. – 3lectrologos

+0

J'espère que c'est clair maintenant. – tback

Répondre

0

Je n'ai aucune expérience réelle avec i18n, donc je ne sais pas ce que vous est disponible pour le back-end, mais vous pouvez utiliser javascript pour trier les menus du navigateur

+0

oui, mais je me sentirais sale si je le faisais. – tback

1

Vous pourriez essayer d'utiliser un widget personnalisé dans le formulaire afin que le tri se fasse juste avant que django ne fasse la traduction. Peut-être que cet extrait de mon projet actuel peut aider

import locale 
from django_countries.countries import COUNTRIES 
from django.forms import Select, Form, ChoiceField 

class CountryWidget(Select): 

    def render_options(self, *args, **kwargs): 
     # this is the meat, the choices list is sorted depending on the forced 
     # translation of the full country name. self.choices (i.e. COUNTRIES) 
     # looks like this [('DE':_("Germany")),('AT', _("Austria")), ..] 
     # sorting in-place might be not the best idea but it works fine for me 
     self.choices.sort(cmp=lambda e1, e2: locale.strcoll(unicode(e1[1]), 
      unicode(e2[1]))) 
     return super(CountryWidget, self).render_options(*args, **kwargs) 

class AddressForm(Form): 
    sender_country = ChoiceField(COUNTRIES, widget=CountryWidget, initial='DE') 
1

Je résolu le même problème en chargeant les valeurs de choix dynamiquement. Je ne me sentais pas sale du tout. Exemple d'obtention de valeurs du modèle Country avec champ de nom contenant le nom du pays. En utilisant la même logique, vous pouvez obtenir vos valeurs de n'importe où.

from django.utils.translation import ugettext_lazy as _ 
from mysite.Models import Country 

class UserProfileForm(forms.ModelForm): 
    def __init__(self, *args, **kwargs): 
     super(UserProfileForm, self).__init__(*args, **kwargs) 
     self.fields['country'].queryset = Country.objects.order_by(_('name')) 

    class Meta: 
     model = Country 
Questions connexes