我有以下型号: 对象C,由画线B载,所包含的对象A
我一有模板的动态表单,并使用jQuery的功能,我可以添加动态的几个领域的这种形式,每一组字段重新presenting对象(B或C)
在提交后的动作,我想创建我的对象树。 我的目标是验证这个模板时创建一个对象树。
目前它的工作原理,但我想我的解决方案是真脏:
创建使用JS / jQuery的名单,据我多少元素在我的表格 在传载文使用。员额$数据参数列表 在一个视图中使用的要求清单,创造了Django的数据模型对象我敢肯定有一个真正的更好的解决方案:P
使用多个职位,通过创建不同的视图对象(不同的A,B和C)? (但不同步的问题。) 使用JSON直接在JS / jQuery的一侧重新present对象? 在另一种解决方案?非常感谢 - 编辑为清楚起见
编辑:
请注意: 我的数据模型,在这里是不同的(我以前简化) 所以 : 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(request.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 viewI'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
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