Создание нескольких объектов в представлении django из сообщения ajax
У меня есть следующая модель :
Объекты С, содержащийся объекты Б, содержащийся объект
У меня есть динамическая форма в шаблоне, и с помощью функций jQuery я могу динамически добавлять несколько полей в эту форму, каждая группа полей представляет объекты (B или C)
При отправке действия post Я хотел бы создать дерево объектов.
Моя цель-создать дерево объектов при проверке этого шаблона.
В настоящее время это работает, но я думаю, что мое решение действительно грязный:
- создание списков с помощью js/jquery, в зависимости от того, сколько элементов у меня в форме
- передача списков тезисов с использованием $.post как аргументы данных
- использование списков в запросе, создание объектов в модели данных django в представлении
Я совершенно уверен, что есть действительно лучшее решение: p
- использовать несколько постов для создания объектов с помощью различных представлений (различных для A, B и C) ? (Но проблемы синхронизации..)
- используйте json для представления объектов непосредственно на стороне js/jquery ?
- другое решение ?
Большое спасибо-отредактировано для ясности
Правка:
Примечание :
Моя модель данных здесь отличается (я упрощал раньше)
Так :
Сеанс является бывшим " объектом а"
Упражнение " объект в"
Повторение - это " объект с"
- Извините за это, я надеюсь, что это будет достаточно ясно (я исправлю в последнем посте)
Некоторый прогресс здесь, с вашей помощью ребята:) я немного поиграл с формой и Формсетом. Очевидно, его мощная :)
Итак, теперь у меня есть следующее представление:
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 динамический встроенный набор форм с автозаполнением , я не буду объяснять это здесь)
В настоящее время, при отправке формы, я получил эту ошибку из вида:
"ключ" вес " не найден в
Если я пытаюсь
repetitionItem.isValid()
Объект RepetitionForm имеет нет атрибута 'isValid"
Та же проблема возникает, если я использую формы.Моделформ вместо форм.Форма
Я совсем застрял: 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()
2 ответов:
Сделайте форму модели для вашей модели " а " вот так.
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() ...
- при инициализации ваших модельных форм в представлении дайте им Префикс
commit = Falseтаким образом, вы можете сохранить полученный объект из предыдущей операции сохранения- использовать наборы форм (https://docs.djangoproject.com/en/dev/topics/forms/formsets/#formsets) для управления n * экземплярами B и C
EDIT
Использование
from django.forms.models import modelformset_factoryне formset_factory, также обратите внимание на исключить параметр.См.: https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#model-formsets
Работает сейчас!
Допустил несколько ошибок:
RepetitionFormSet = formset_factory(RepetitionForm, extra=1) if request.method == 'POST': repetitionFormSet = repetitionFormSet(request.POST) #should be repetitionFormSet = RepetitionFormSet(request.POST)Is_valid имеет решающее значение (вместо этого объекты не заполняются!), и я пытался позвонить
repetitionForm.isValid()Которая должна быть функцией Java, но не существует на объектах django form ! (глупый я)
И, наконец, иногда я тестировал свой код без заполнения полей, создавая исключение KeyError. Я не уверен, что это нормально, мне придется иметь дело с этим сейчас
Большое спасибо Фрэнсису !
Comments