Создание нескольких объектов в представлении 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()
730   2  

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

        ...
  1. при инициализации ваших модельных форм в представлении дайте им Префикс
  2. commit = False таким образом, вы можете сохранить полученный объект из предыдущей операции сохранения
  3. использовать наборы форм (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

    Ничего не найдено.