0

これが私が一日苦労してきたことです...

モデルへのメッセージモデルがありrecipientsます。ManyToManyFieldUser

次に、メッセージを作成するためのフォームがあります。何千人ものユーザーがいるため、フォームの複数選択ウィジェットにオプションを表示するのは便利ではありません。これはデフォルトの動作です。代わりに、FcbkComplete jqueryプラグインを使用して、受信者フィールドを、ユーザーが受信者を入力する入力フィールドのように見せました。これは機能します。

だが...

フォームページには表示されませんが、すべてのユーザーリストが選択フィールドのページに表示されます。これは明らかな理由で私が望まないことです。

検証とクエリセットを操作するModelChoiceFieldの動作をオーバーライドしてみたり、MultipleChoiceウィジェットなどで遊んだりしましたが、どれも機能せず、自然に感じられませんでした。

それでは、クライアント側にオプションの全リストがないようにするが、それでもクエリセットに対して検証できる(最良の)方法は何ですか?

4

4 に答える 4

1

django-ajax-selectsを見たことがありますか?私はそれを使ったことがありませんが、あなたが解決しようとしているように聞こえるような問題に遭遇したときのために、それは私のメンタルグラブバッグに入っています...

于 2011-02-08T21:44:30.370 に答える
1

私は2つの方法のいずれかを試します(どちらも悪いかもしれません!私は本当にここで声を出して考えています):

  1. フィールドのクエリセットを空に設定し(queryset = Model.objects.none())、jqueryツールでユーザーの選択/検索にajaxビューを使用するようにします。clean_field関数を使用して、ユーザーが有効であることを手動で検証します。

  2. これが私の好みの選択です。フィールドのクエリセットをループしないようにテンプレートを編集します。これにより、htmlのselectタグ内に0個のオプションが含まれるようになります。つまり、form.as_p()メソッドなどを使用しません。

私がよくわからないことの1つは、#2がまだデータベースにヒットし、5k以上のオブジェクトを引き出して、htmlに表示しないかどうかです。私はそうすべきではないと思いますが...確かではありません!

于 2011-02-08T22:18:21.140 に答える
0

提案を気にせず、IDを使用しても問題がない場合、DjangoAdminにはこれらの状況に対応するraw_id_field属性が付属しています。

IDの代わりにユーザー名を使用して有効なユーザーを返すウィジェットを作成することもできます。次の行の中で何か:

# I haven't tested this code. It's just for illustration purposes
class RawUsernameField(forms.CharField):
  def clean(self, value):
    try:
      return User.objects.get(username=value)
    except User.DoesNotExist:
      rause forms.ValidationError(u'Invalid Username')
于 2011-02-08T22:41:30.450 に答える
0

forms.ModelMultipleChoiceFieldのデフォルトウィジェットをオーバーライドすることでこれを解決します。新しいウィジェットは、オプションのリスト全体ではなく、選択したフィールドのみを返します。

class SelectMultipleUserWidget(forms.SelectMultiple):
    def render_options(self, choices, selected_choices):
        choices = [c for c in self.choices if str(c[0]) in selected_choices]
        self.choices = choices
        return super(SelectMultipleUserWidget, 
                     self).render_options([], selected_choices)

class ComposeForm(forms.Form):
    recipients = forms.ModelMultipleChoiceField(queryset=User.objects.all(),
                                                widget=SelectMultipleUserWidget)
    ...
于 2011-02-11T20:34:23.410 に答える