0

ブール値を持つテーブルを介してリンクされた多対多のフィールドを持つモデルがあります。

私はこれを別のシナリオで取得しました。ユーザーをメイン モデル、interest を多対多フィールド、user_interest モデルをスルー モデルとして取ります。多くの価値、

現時点では、私のニーズに応える適切なフォーム インターフェイスを見つけようとして立ち往生しています。現在、関心のある選択のみを表示する MultipleSelect ウィジェットを使用しています。関心を選択して値を指定できるフィールド コントロールの例はありますか?ブールフィールド? そうでない場合、私の状況で従うべきベストプラクティスは何ですか?

よろしくお願いします、

コードサンプルで質問を更新する

class Interest(models.Model):
    name = models.CharField(_('Name'), max_length=200, )


class UserInterest(models.Model):
    interest = models.ForeignKey(Interest, )
    user = models.ForeignKey(getattr(settings, 'AUTH_USER_MODEL'), )
    join_mail_list = models.BooleanField(default=False)

class User(models.Model):
  name = models.CharField(max_length=100)
  interest = models.ManyToManyField(Interest, through='UserInterest', related_name='user_interest')

上記のモデルに基づいて、User モデルから ModelForm を作成しようとすると、完全に正しい MultiSelect フィールドとして関心が高まります。しかし、私の場合、フォームでユーザーの関心を収集し、その特定の関心のために join_mail_list したい場合は、関心ごとにフォームを作成したいと考えています。お知らせ下さい?

4

2 に答える 2

0

横にチェックボックスがあるすべての興味のリストが必要だと仮定します。

これらのモデルを仮定しましょう:

class Ressource(models.Model):
    name = models.CharField(max_length=255)

class Ressource2Village(models.Model):
    ressource = models.ForeignKey(Ressource)
    village = models.ForeignKey(Village)
    amount = models.FloatField()

class Village(MapObject):
    name = models.CharField(max_length=255)

そして、このフォーム:

class Ressoure2VilllageForm(forms.Form):
    name = forms.CharField()
    # you would use a BooleanField
    value = forms.IntegerField()

これでフォームセットを作成できます ( https://docs.djangoproject.com/en/1.5/topics/forms/formsets/ ):

from django.forms.formsets import formset_factory
r2v_formset = formset_factory(Ressoure2VilllageForm)

# use boolean for your case, if you want to edit these values later use n2m to initialize value
# [{'name': r2v.ressource.name, 'value': r2v.value} for r2v in your_village.ressource2village.all()]
init_values = [{'name': r.name, 'value': 0} for r in Ressource.objects.all()] 
r2v_formset = r2v_formset(initial=init_values)

あなたのテンプレートであなたに与えるもの:

<label for="id_form-0-name">Name:</label><input type="text" name="form-0-name" value="Kohle" id="id_form-0-name">
<label for="id_form-0-value">Value:</label><input type="text" name="form-0-value" value="0" id="id_form-0-value"> 
<label for="id_form-1-name">Name:</label><input type="text" name="form-1-name" value="Eisenerz" id="id_form-1-name">
<label for="id_form-1-value">Value:</label><input type="text" name="form-1-value" value="0" id="id_form-1-value"> 
<label for="id_form-2-name">Name:</label><input type="text" name="form-2-name" value="Golderz" id="id_form-2-name">
[...]

特定のユーザーへの関連付けは、認証の詳細を考慮して処理中に行うことができます。

これを表示、検証、処理するのは非常に簡単です。フォローアップの質問をしてください。

于 2013-08-25T17:41:34.547 に答える
0

質問は一種の一般的なものですが、これはブール型のフィールドであるため、1 つの複数選択フィールドではなく、2 つのフィールドがあると言えます。私は…には興味がない」(誤)。両方のフィールドは同じ項目リストから複数選択されますが、分離により、ユーザーは気づかずにブール値フィールドを適用できます。また、jQuery UI オートコンプリートを強くお勧めします。ここでは最良の選択と思われます。

更新された回答:

したがって、コードを確認すると、いくつかのことが明確になります。私がそれを行う方法は、最初に提案したのと同じですが、少し微調整します。

「興味」ごとにニュースレターのチェックボックスを用意するのは、ユーザーが「興味」を 2 回チェックする必要があるため、扱いにくいです。したがって、ユーザーが関心のある件名の電子メールを受け取りたいと自動的に想定する必要がありますが、必要に応じてそれを防止できるようにする必要があります。

それを念頭に置いて、2 つの長いテキスト入力を作成し、タグ付けシステムを使用して両方を実装します (ここに良いものがあります。ここにいくつかあります)。最初の入力は「興味があります」、2 番目は「~についてのメールを受け取りたい」です。次に、jQuery を使用してイベント リスナを追加します。これにより、最初の入力にタグが追加されるたびに、2 番目の入力にも自動的に追加されます。次に、ユーザーが特定の件名 (またはすべて) のメールを受け取りたくない場合は、2 番目の入力から簡単に削除できます (最初の件名には影響しません)。

例として、 choose -jQuery ライブラリでそれを実現する方法を示すjsfiddleを次に示します。選択した図書館のウェブサイトに事前に作成されたリストがあったので、国と配送を使用したので、そこからコピーしました. ご覧のとおり、これは非常に単純な jQuery コードであり、他のタグ付けシステムにも簡単に適用できます (そして、私自身がそれを解決するのを手伝ってくれたすばらしい Raúl Juárez に感謝します)。

$(".chosen-select").chosen({disable_search_threshold: 10});
$('#countries').on('change', function(e) {
    var selected = $(this).val();
    $.each(selected, function(index, value) {
        $('#shipping option[value="'+value+'"]:first').prop('selected',true);
    });
    $(".chosen-select").trigger('chosen:updated');
});
于 2013-08-25T17:03:06.547 に答える