1

私はこのようなものを持っているとしましょう:

class Product(models.Model)
    name = models.CharField()
    description models.TextField()

class Image(models.Model)
    product = models.ForeignKey(Product, null=True, blank=True, related_name="images")
    image = models.ImageField()

私がを作成するためのフォームにいてProduct、このフォームに画像をアップロードできるセクションがあるとします。これらの画像は非同期でアップロードされます。どうすれば次のようにできますか?

作成時:
製品が作成され、画像がそれに関連付けられます。

編集時:
製品がフェッチされ、関連する画像がフェッチされます。商品を編集し、画像を編集します。

現在、私は作成と編集の両方の仕事をするビューを持っていますProducts。この製品フォームの画像関連部分をどのように達成できますか?モデルフォームセット?

編集:

@login_required
def create_or_edit_product(request, product_id=None):
    # Redirect user if he has no account associated to him
    try:
        account = Account.objects.get(membership__user=request.user)
    except:
        login_url = reverse('login') + ('?next=%s') % request.path
        return HttpResponseRedirect(login_url)

    # Get product if product id passed
    product_instance = None
    if product_id is not None:
        product_instance = get_object_or_404(product, id=product_id)

    # Get related pictures if product exists. Get picture values (dictionary list, used for initial formset data) if pictures found.
    pictures = product.pictures.all() if product_instance is not None else None
    pictures_values = pictures.values() if pictures else []

    PictureFormSet = formset_factory(PictureForm, formset=BasePictureFormSet, extra=0, can_delete=False, max_num=40)

    if request.method == "POST":
        product_form = productForm(request.POST, prefix='product', instance=product_instance)
        picture_formset = PictureFormSet(request.POST, prefix='pictures', initial=pictures_values)

        # If forms are valid
        if product_form.is_valid() and picture_formset.is_valid():
            try:
                # Add account to product and save
                product = product_form.save(commit=False)
                if product_instance is None:
                    product.account = account
                product.save()

                # Remove picture-product relationships of current pictures
                if pictures is not None:
                    pictures.update(product=None)

                # Update each picture with the product and corresponding sort order. (The field 'id' is a picture object. The form converts the passed picture id to a picture object)
                for index, form in enumerate(picture_formset):
                    picture = form.cleaned_data['id']
                    Picture.objects.filter(id=picture.id).update(product=product, sort_order=index)

            except Exception, e:
                # Rollback changes - something went wrong
                transaction.rollback()
                print "Transaction Rollback: %s" % e
            else:
                # Commit changes and redirect to product edit page
                transaction.commit()
                return HttpResponseRedirect('product_edit', product_id=product.id)
    else:
        product_form = productForm(prefix='product', instance=product_instance)
        picture_formset = PictureFormSet(prefix='pictures')

    # TODO: change add template to an add/edit one
    return render_to_response('products/add.html', {
        'product_form' : product_form,
        'picture_formset' : picture_formset,
        'pictures' : pictures,
    }, 
    context_instance=RequestContext(request))

私はPythonとDjangoを初めて使用しますが、それは私のやや実用的な見方です。(これまでのところ、新製品を追加しようとしただけです)

ユーザーに表示されるフォームには、各画像IDを含む非表示の入力を含むサムネイルがあります。フォームが失敗した場合は、非表示の入力(すでに保持されている)とともにサムネイルを再表示したいと思います。それを機能させるには、画像IDを照会する必要があると思いますが、フォームが有効ではないので、どうすればよいでしょうか。(それが正しい道でさえあるなら)

どう思いますか?

4

1 に答える 1

0

@Aamir Adnanは正しいですModel Formsets。これは、これに対処するためのエレガントな方法です。

必要なものに似た本格的な例を次に示します- http://stellarchariot.com/blog/2011/02/dynamically-add-form-to-formset-using-javascript-and-django/

例のように、エンドユーザーは製品に関連する追加の「画像」(あなたの場合) を追加する必要がある場合があるため、フォームの動的な追加を処理するための JavaScript ロジックが必要になります。保存時に画像をアップロードします。

于 2012-11-21T00:22:41.917 に答える