0

テンプレートに ManyToManyField を表示しようとしています:

class GvtCompo(models.Model):
    startDate=models.DateField(max_length=10, blank=False, null=False)
    endDate=models.DateField(max_length=10, blank=False, null=False)
    gvtCompo= models.CharField(max_length=1000, blank=False, null=False)

class Act(models.Model):
    gvtCompo= models.ManyToManyField(GvtCompo)

私の見解では、問題なくオブジェクトを表示できます。

for gvtCompo in act.gvtCompo.all():
    print gvtCompo.gvtCompo

私のテンプレートには、次のコードを含む「GvtCompo オブジェクト」のリストがあります (良くありません)。

{% for field in form %}
    <div class="fieldWrapper">
        {{ field.errors }}
        {{ field }}
    </div>
{% endfor %}

私はそれをより良くしようとしましたが、次のコードは機能しません(何も表示されません):

{% for field in form %}
    {% if field.name == "gvtCompo" %}
        {% for gvtCompo in field.gvtCompo.all %}
            {{ gvtCompo.gvtCompo }}
        {% endfor %}
    {% endif %}
{% endfor %}

どうしたの?

*編集: *

フォームを使用せず、render_to_response に渡されたモデル (act) のインスタンスを使用すると、ManyToManyField の値が表示されます。

{% for gvtCompo in field.gvtCompo.all %}

に変更

{% for gvtCompo in act.gvtCompo.all %}

ただし、フォーム フィールドはもうないため、変更、検証、および保存することはできません。

4

2 に答える 2

1

あなたはステップをスキップしています。最初にフォームを作成する必要があります。

forms.py で ModelForm を作成できます。ModelForm は、モデルに基づくフォームです。

from django.forms import ModelForm from myapp.models import Act

class ActForm(ModelForm):
   class Meta:
       model = Act

次に、あなたの見解:

from myapp.models import Act
from myapp.forms import ActForm


def add_view(request):
    if request.method == 'POST':
        form = ArticleForm(request.POST)
        if form.is_valid():
            form.save()
    else:
        form = ActForm() # Creating a empty form.
    return render_to_response("template.html", {
        "form": form,
    })

def edit_view(request):
    obj = Act.objects.get(pk=1)

    if request.method == 'POST':
        form = ArticleForm(request.POST)
        if form.is_valid():
            form.save()
    else:
        form = ActForm(instance=obj) # Creating form pre-filled with obj.
    return render_to_response("template.html", {
        "form": form,
    })

この状況を複数回実装したい場合。DRY: https://docs.djangoproject.com/en/1.5/topics/class-based-views/intro/#handling-forms-with-class-based-views

あなたの template.html で:

{{ form }}

免責事項: このコードはテストされていません。 https://docs.djangoproject.com/en/1.5/ref/forms/ https://docs.djangoproject.com/en/1.5/topics/forms/modelforms/

アップデート:

<form>...</form>テンプレートの1 つに複数のフォームを渡すことができます。したがって、2 つのフォームを作成します。1 つの Act フォーム (上記参照) と 1 つの GvtCompo フォームセット。フォームセットには、Act に関連するすべての GvtCompo が含まれています。

from django.forms.models import modelformset_factory

act = Act.objects.get(pk=1) #The same act as you used to create the form above.

GvtFormSet = modelformset_factory(GvtCompo)
formset = GvtFormSet(queryset=act.gvtCompo.all())

テンプレートは次のとおりです。

<form ...>
{% for field in form %}
    {% if field.name == "gvtCompo" %}
        {{ formset }}
    {% else %}
        {{ field }}
    {% endif %}
{% endfor %}
</form>

注: フォームとフォームセットのフィールド名が衝突している場合は、prefix="some_prefix" を使用してください: Django - 複数のフォームでの作業

于 2013-07-28T11:45:08.387 に答える
0

フォームをループするときは、次のようにする必要があります。

{% for field in form %}
    {% if field.name == "gvtCompo" %}
        {% for gvtCompo in form.instance.gvtCompo.all %}
            {{ gvtCompo.gvtCompo }}
        {% endfor %}
    {% endif %}
{% endfor %}

フィールド自体には関連がありませんfield.gvtCompo

于 2013-07-28T10:41:13.653 に答える