从阿贾克斯后创建的Django视图多个对象多个、视图、对象、阿贾克斯后

2023-09-10 17:38:36 作者:stranger 陌客

我有以下型号: 对象C,由画线B载,所包含的对象A

我一有模板的动态表单,并使用jQuery的功能,我可以添加动态的几个领域的这种形式,每一组字段重新presenting对象(B或C)

在提交后的动作,我想创建我的对象树。 我的目标是验证这个模板时创建一个对象树。

目前它的工作原理,但我想我的解决方案是真脏:

创建使用JS / jQuery的名单,据我多少元素在我的表格 在传载文使用。员额$数据参数列表 在一个视图中使用的要求清单,创造了Django的数据模型对象

我敢肯定有一个真正的更好的解决方案:P

使用多个职位,通过创建不同的视图对象(不同的A,B和C)? (但不同步的问题。) 使用JSON直接在JS / jQuery的一侧重新present对象? 在另一种解决方案?

非常感谢 - 编辑为清楚起见

编辑:

16场比赛打入51球 阿贾克斯这赛季又火了

请注意: 我的数据模型,在这里是不同的(我以前简化) 所以 : Session是以前的对象A 运动是物体B 重复是对象C -Sorry的,我希望这将是足够清晰的(我会纠正最后一篇文章中)

有些进展了,在您的帮助球员:)我打一点点形式和表单集中。很显然,它的强大:)

所以,现在我有以下看法:

 类RepetitionForm(forms.Form):
    体重= forms.CharField()
    数= forms.CharField()

高清workoutForm(要求):
    RepetitionFormSet = formset_factory(RepetitionForm,额外= 1)

    如果request.method =='POST':
        repetitionFormSet = RepetitionFormSet(request.POST)

        用户= get_object_or_404(用户,PK = 1)
        会议=会话(日期= datetime.date.today(),用户=用户)
        的session.save()

        exerciseTypeRef = get_object_or_404(ExerciseTypeRef,PK = 1)
        运动=练习(会话=会话,exerciseTypeRef = exerciseTypeRef)
        exercise.save()

        如果repetitionFormSet.is_valid():
            对于repetitionForm在repetitionFormSet.cleaned_data:
                如果(repetitionForm.is_valid()):
                    重量= repetitionForm.data ['重']
                    数= repetitionForm.data ['伯爵']
        返回的Htt presponse(OK)
    其他:
        repetitionFormSet = RepetitionFormSet()

    返回render_to_response('workoutForm.html',{'FORMSET:repetitionFormSet},context_instance = RequestContext的(要求))
 

模板侧是这样的:

  {%csrf_token%}
{{formSet.management_form}}
&所述;微升的id =idUlFormSet>
{%的项目在FORMSET%}
    <李>
    {{ 项目 }}
    < /李>
{%ENDFOR%}
 

(更多code被用在模板中添加动态生成实例,因为这个聪明的职位描述它 Django - 使用Javascript动态在线表单集中使用自动完成的,我不会在这里解释一下)

目前,提交表单的时候,我从视图收到此错误:

键重量中找不到

如果我想要一个

  repetitionItem.isValid()
 

RepetitionForm'对象有没有属性'的isValid

如果我使用forms.ModelForm代替forms.Form出现同样的问题。

我很卡住了:P

我的模型

 类用户(models.Model):
名称= models.CharField(MAX_LENGTH = 100)
邮件= models.CharField(MAX_LENGTH = 100)
dateCreated会= models.DateTimeField(用户创建日期)
高清__uni code __(个体经营):
    回报self.name


一流的会议(models.Model):
日期= models.DateField(会议日期)
用户= models.ForeignKey(用户)
高清__uni code __(个体经营):
    返回self.date.strftime(%Y /%M /%D)


类ExerciseTypeRef(models.Model):
名称= models.CharField(MAX_LENGTH = 100)
DESC = models.CharField(MAX_LENGTH = 300)
高清__uni code __(个体经营):
    回报self.name


类练习(models.Model):
会议= models.ForeignKey(会话)
exerciseTypeRef = models.ForeignKey(ExerciseTypeRef)
高清__uni code __(个体经营):
    返回self.exerciseTypeRef.name

类重复(models.Model):
运动= models.ForeignKey(练习)
数= models.IntegerField()
体重= models.IntegerField()
 

解决方案

做一个模型,表格的A的模式,像这样。

 类FORMA(forms.ModelForm):
    注册表格
    类元:
        模型=对象A
 

在您的视图:

 从django.forms.models进口modelformset_factory
高清格式(要求):
    #使用Modelformset_factory并排除FK领域
    FormBSet = modelformset_factory(对象B,排除=('对象A',))
    FormCSet = modelformset_factory(ObjectC,排除=('对象B',))

    如果request.method ==POST:
        备考= FORMA(r​​equest.POST,preFIX =备考)
        formbset = FormBSet(request.POST,preFIX =formbset)
        formcset = FormCSet(request.POST,preFIX =formcset)
        如果forma.is_valid()和formbset.is_valid()和formcset.is_valid():
            #保存
            A = forma.save()

            #保存到b中
            对于formb在formbset:
                B = formb.save(提交= FALSE)
                b.objecta =一
                b.save()

            #拯救B插入Ç
            对于formc在formcset:
                C = formc.save(提交= FALSE)
                c.objectb = B
                c.save()

        ...
 

在视图初始化你modelForms时给他们一个preFIX 提交=假这样就可以得到的对象保存在previous保存操作 使用表单集(https://docs.djangoproject.com/en/dev/topics/forms/formsets/#formsets)来管理N * B的和C的实例

修改

使用从django.forms.models进口modelformset_factory 不会 formset_factory,同时,注意排除paramater。

请参阅: https://docs.djangoproject.com / EN /开发/主题/表格/ modelforms /#模型表单集

I have the following model : Objects C, contained by objects B, contained by object A

I a have a dynamic form in a template, and using jQuery functions, I can add dynamically several fields to this form, each group of fields representing Objects (B or C)

When submitted by a post action, I'd like to create my object tree. My objective is to create an object tree when validating this template.

Currently it works, but I guess my solution is really dirty:

Creating lists using js/jquery, according how many elements I have in my form Passing theses lists using $.post as data arguments Using the lists in request, creating objects in django data model in a view

I'm quite sure there's a really better solution :p

Use multiple post to create Objects through different views (distinct for A, B and C) ? (But sync problems..) Use json to represent objects directly on js/jquery side ? Another solution ?

Many Thanks - edited for clarity

EDIT:

Note : My data model here is different (I'd simplified before) So : Session is former "object A" Exercise is "object B" Repetition is "object C" -Sorry for that, I hope It'll be clear enough (I'll correct in final post)

Some progress here, with your help guys :) I've played a little bit with Form and FormSet. Obviously, its powerfull :)

So now I have the following view:

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))

Template side is like :

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

(More code is used in template to add dynamically form instances, as this clever post describes it Django - Javascript dynamic inline FormSet with autocomplete, i wont explain it here)

Currently, when submitting form, I received this error from view :

"Key 'weight' not found in

If I'm trying a

repetitionItem.isValid()

"RepetitionForm' object has no attribute 'isValid"

The same problem appears if I'm using forms.ModelForm instead of forms.Form

I'm quite stuck :p

My Models

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()

解决方案

Make a Model Form for your "A" model like so.

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

in your view:

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()

        ...

when initializing your modelForms in the view give them a prefix commit = False so that you can save the resulting object from the previous save operation Use Formsets (https://docs.djangoproject.com/en/dev/topics/forms/formsets/#formsets) to manage n* instances of B's and C's

EDIT

use from django.forms.models import modelformset_factory NOT formset_factory, also, note the exclude paramater.

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