2011-05-12 26 views
2

私は自動的になど、独自のchoicefieldの選択肢を生成フォーム(forms.Form)を持っていますその内容は何とかキャッシュされます。私のローカルPC、またはリモートサーバー上のapacheでdevサーバーを再起動する前に、新しいエントリが表示されません。Djangoのフォームchoicefield自動的に生成された選択肢

このコードはいつ評価されますか?どのようにすれば、毎回のエントリを再計算できるようにすることができますか?

PS。 memchachedおよび他の種類のキャッシングはオフになります。

答えて

2

私は

例えばのようなもの、あなたがフォームが呼び出されたときに、それが評価されるように初期化を経て、これを行うために必要があると思います

def __init__(self, *args, **kwargs): 
    super(UserForm, self).__init__(*args, **kwargs) 
    from vn.account.models import UserProfile 
    up = UserProfile.objects.filter(user__isnull=True) 
    choices = [('0','--')] 
    choices += ([(s.id ,'%s %s (%s), username: %s, email: %s' % (s.first_name, s.last_name,s.company_name, s.username, s.email)) for s in up]) 

    self.fields['user'].choices = choices 
+0

カスタムコンストラクタを定義することはうまくいくようです。ありがとう。 – Dim

1

より良い解決策は、バージョン1.8から始まる入手可能です:DjangoのChoiceFieldはability to pass a callable to choicesを持っています。

このフィールドの選択、またはそのような反復可能を返す呼び出し可能として使用する2組の(例えば、リストまたはタプル)反復可能のいずれか。 引数が呼び出し可能な場合は、フィールドのフォームが初期化されるたびに と評価されます。

だから今、あなただけの

class UserForm(forms.Form): 
    def generate_choices(): 
     from vn.account.models import UserProfile 
     up = UserProfile.objects.filter(user__isnull=True) 
     choices = [('0','--')] 
     choices += ([(s.id ,'%s %s (%s), username: %s, email: %s' % (s.first_name, s.last_name, s.company_name, s.username, s.email)) for s in up]) 
     return choices 

    user = forms.ChoiceField(label=_('Select from interest form'), choices=generate_choices) 

また、あなたは、このタスクにModelChoiceFieldを使用することができますを書くことができます。

関連する問題