4

次のように宣言されたモデル属性と製品があります。

class Attribute(models.Model):
    value = models.TextField()
    owner = models.ForeignKey(User)
    type = models.ForeignKey(AttributeType)     
    image = ImageField(upload_to='attributes', null=True, blank=True)     
    related_attribute = models.ManyToManyField('self', blank = True, null = True) 

class BaseWorkspace(models.Model):
    name = models.CharField(max_length=255)
    owner = models.ForeignKey(User)
    attributes = models.ManyToManyField('Attribute', blank = True, null = True)
    created = CreationDateTimeField()
    modified = ModificationDateTimeField()
    comments = models.ManyToManyField('Comment', blank = True, null = True )
    sort_order = models.IntegerField(blank = True)

class Product(BaseWorkspace):
    project = models.ForeignKey('Project', related_name='products')

フォームセットを使用してmm関係を確立するにはどうすればよいですか?私はこのようなモデルフォームセットファクトリを試しました:

AttributeFormset = modelformset_factory(Attribute, form=AttributeForm)

汎用ビューでこの関数を使用すると、次のようになります。

def form_valid(self, form):
        f = form.instance
        f.sort_order = Product.default_sort_order()
        f.owner = self.request.user
        f.project = get_object_or_404(Project, pk=self.kwargs['pk'])
        context = self.get_context_data()
        attribute_form = context['attribute_form']
        if attribute_form.is_valid():
            self.object = form.save()
            attribute_form.instance = self.object
            attribute_form.save()
            return HttpResponseRedirect(reverse(self.get_success_url()))
        else:
            return self.render_to_response(self.get_context_data(form=form))

しかし、私はそれを機能させることができません。何か案は?

4

2 に答える 2

0

次のようなことを試してください:

from django.forms.models import modelformset_factory
def my_view_function(request) :

    # not sure where the product whose formset we are working on comes from
    product = <whatever>

    AttributeFormSet = modelformset_factory(Attribute)

    if request.method == "POST" :
        # POST bound formset
        formset = AttributeFormSet(request.POST, queryset=Attribute.objects.filter(product=product))
        # If the entire formset is valid
        if formset.is_valid() :
            for form in formset:
                # Save each form in the set
                b = form.save()
        else : 
            #There was an error (add a message using the messages framework?)
            pass
    else :
        # initial formset w/o post
        formset = AttributeFormSet(queryset=Attribute.objects.filter(product=product))

    ...

より具体的な答えを出すのは難しいですが、クラスベースのビューを使用している場合は、ビュー関数全体またはビュー クラスが必要になると思います。

あなたのテンプレートでは、これと同じくらい単純なもの(ドキュメントから)でそれを行う必要があります。

<form method="post" action="">
    {{ formset.management_form }}
    <table>
        {% for form in formset %}
        {{ form }}
        {% endfor %}
    </table>
</form>

実行時に JavaScript を使用してフォームセットにフォームを追加する機能が必要な場合は、http ://code.google.com/p/django-dynamic-formset/ を参照してください。私はそれを使ったことはありませんが、少なくとも正しい方向への一歩のように見えます.

編集

最初にフォームセットから製品を除外します

AttributeFormSet = modelformset_factory(Attribute, exclude=('product',))

次に、保存時にコミットしないようにフォーム処理ブロックを変更し、手動で製品をアタッチします。

        if formset.is_valid() :
            for form in formset:
                # get this form's instance
                b = form.save(commit=False)
                # attach product
                b.product = product
                # save the instance
                b.save()
于 2012-12-14T16:09:00.900 に答える
0

を使用しf = form.instanceて、元のインスタンスにアクセスします。formattribute_form が有効な場合は、 の代わりに でsave メソッドを呼び出しますf。行った変更はすべてf失われます。

保存する前にフォームセットのインスタンスを更新する方法については、フォームセット内のオブジェクトを保存する方法をご覧ください。

于 2012-12-17T09:19:23.727 に答える