4

私は次のモデルを持っています:オブジェクトC、オブジェクトBに含まれ、オブジェクトAに含まれています

テンプレートに動的フォームがあり、jQuery関数を使用して、このフォームにいくつかのフィールドを動的に追加できます。フィールドの各グループはオブジェクト(BまたはC)を表します。

ポストアクションで送信されたら、オブジェクトツリーを作成したいと思います。私の目的は、このテンプレートを検証するときにオブジェクトツリーを作成することです。

現在は機能していますが、私のソリューションは本当に汚いと思います。

  • フォームにある要素の数に応じて、js/jqueryを使用してリストを作成する
  • データ引数として$.postを使用してこれらのリストを渡す
  • リクエストのリストを使用して、ビューのdjangoデータモデルにオブジェクトを作成します

私は本当により良い解決策があると確信しています:p

  • 複数の投稿を使用して、さまざまなビュー(A、B、Cで区別)を介してオブジェクトを作成しますか?(しかし、同期の問題..)
  • jsonを使用して、js / jquery側でオブジェクトを直接表現しますか?
  • 別の解決策?

多くの感謝-明確にするために編集

編集:

注:ここでの私のデータモデルは異なります(前に簡略化した)ので:セッションは以前の「オブジェクトA」です演習は「オブジェクトB」です繰り返しは「オブジェクトC」です-申し訳ありませんが、十分に明確になることを願っています(最終投稿で修正します)

ここで、あなたの助けを借りて、いくつかの進歩があります:)私はFormとFormSetで少し遊んだことがあります。明らかに、その強力な:)

だから今私は次のビューを持っています:

class RepetitionForm(forms.Form):
    weight = forms.CharField()
    count = forms.CharField()

def workoutForm(request):
    RepetitionFormSet = formset_factory(RepetitionForm, extra=1)

    if request.method == 'POST':
        repetitionFormSet = RepetitionFormSet(request.POST)

        user = get_object_or_404(User, pk=1)
        session = Session(date=datetime.date.today(), user=user)
        session.save()

        exerciseTypeRef = get_object_or_404(ExerciseTypeRef, pk=1)  
        exercise = Exercise(session = session, exerciseTypeRef = exerciseTypeRef)
        exercise.save()

        if repetitionFormSet.is_valid():
            for repetitionForm in repetitionFormSet.cleaned_data:
                if(repetitionForm.is_valid()):
                    weight = repetitionForm.data['weight']
                    count = repetitionForm.data['count']
        return HttpResponse("ok")
    else:
        repetitionFormSet = RepetitionFormSet()

    return render_to_response('workoutForm.html', {'formSet': repetitionFormSet}, context_instance=RequestContext(request))

テンプレート側は次のようなものです:

{% csrf_token %}
{{ formSet.management_form }}
<ul id="idUlFormSet">
{% for item in formSet %}
    <li>
    {{ item }}
    </li>
{% endfor %}

(この巧妙な投稿で動的にフォームインスタンスを追加するために、テンプレートでより多くのコードが使用されています 。Django-オートコンプリートを使用したJavascript動的インラインFormSet、ここでは説明しません)

現在、フォームを送信すると、ビューから次のエラーが表示されました。

「キー'ウェイト'が見つかりません

私がしようとしている場合

repetitionItem.isValid()

「RepetitionForm」オブジェクトに属性「isValid」がありません

forms.Formの代わりにforms.ModelFormを使用している場合も、同じ問題が発生します。

私はかなり立ち往生しています:p

私のモデル

class User(models.Model):
name = models.CharField(max_length=100)
mail = models.CharField(max_length=100)
dateCreated = models.DateTimeField('User creation date')
def __unicode__(self):
    return self.name


class Session(models.Model):
date = models.DateField('Session Date')
user = models.ForeignKey(User)
def __unicode__(self):
    return self.date.strftime("%Y/%m/%d")


class ExerciseTypeRef(models.Model):
name = models.CharField(max_length=100)
desc = models.CharField(max_length=300)
def __unicode__(self):
    return self.name


class Exercise(models.Model):
session = models.ForeignKey(Session)
exerciseTypeRef = models.ForeignKey(ExerciseTypeRef)
def __unicode__(self):
    return self.exerciseTypeRef.name

class Repetition(models.Model):
exercise = models.ForeignKey(Exercise)
count = models.IntegerField()
weight = models.IntegerField()
4

2 に答える 2

2

このように「A」モデルのモデルフォームを作成します。

class FormA(forms.ModelForm) :
    """Signup Form"""        
    class Meta :
        model = ObjectA

あなたの見解では:

from django.forms.models import modelformset_factory
def form(request) :
    # Use Modelformset_factory and exclude the FK fields
    FormBSet = modelformset_factory(ObjectB, exclude=('objecta',))
    FormCSet = modelformset_factory(ObjectC, exclude=('objectb',))

    if request.method == "POST" :
        forma = FormA(request.POST, prefix="forma")
        formbset = FormBSet(request.POST, prefix="formbset")
        formcset = FormCSet(request.POST, prefix="formcset")
        if forma.is_valid() and formbset.is_valid() and formcset.is_valid() :
            # save a
            a = forma.save()

            # save a into b
            for formb in formbset:
                b = formb.save(commit=False)
                b.objecta = a
                b.save()

            # save b into c
            for formc in formcset:
                c = formc.save(commit=False)
                c.objectb = b
                c.save()

        ...
  1. ビューでmodelFormsを初期化するときに、接頭辞を付けます
  2. commit = False前の保存操作の結果のオブジェクトを保存できるようにします
  3. フォームセット(https://docs.djangoproject.com/en/dev/topics/forms/formsets/#formsets)を使用して、BおよびCのn*インスタンスを管理します

編集

from django.forms.models import modelformset_factory NOT formset_factoryを使用します。また、除外パラメーターに注意してください。

参照:https ://docs.djangoproject.com/en/dev/topics/forms/modelforms/#model-formsets

于 2012-12-03T15:36:27.780 に答える
0

今すぐ動作します!

いくつかの間違いを犯していました:

RepetitionFormSet = formset_factory(RepetitionForm, extra=1)
if request.method == 'POST':
    repetitionFormSet = repetitionFormSet(request.POST)
    #should be
    repetitionFormSet = RepetitionFormSet(request.POST)

is_valid IS CRUCIAL(代わりにオブジェクトは入力されません!)、そして私は呼び出しようとしていました

repetitionForm.isValid()

これはJava関数である必要がありますが、djangoフォームオブジェクトには存在しません!(愚かな私)

そして最後に、フィールドに入力せずにコードをテストして、KeyError例外をスローすることがありました。これが正常かどうかはわかりませんが、今すぐ対処する必要があります

フランシスに感謝します!

于 2012-12-08T17:16:50.737 に答える