Django: Инициализация FormSet пользовательских форм с экземплярами

Учитывая следующие модели:

class Graph(models.Model):
    owner = models.ForeignKey(User)

    def __unicode__(self):
        return u'%d' % self.id

class Point(models.Model):
    graph = models.ForeignKey(Graph) 
    date  = models.DateField(primary_key = True)
    abs   = models.FloatField(null = True)
    avg   = models.FloatField(null = True)

    def __unicode__(self):
        return u'%s' % self.date

Я пытаюсь создать форму для редактирования списков Точек. Теги ввода HTML требуют, чтобы дополнительные атрибуты были установлены, таким образом, я использую следующую пользовательскую форму:

class PointForm(forms.ModelForm):
    graph = forms.ModelChoiceField(queryset = Graph.objects.all(),
                                   widget   = forms.HiddenInput())
    date  = forms.DateField(widget = forms.HiddenInput(), label = 'date')
    abs   = forms.FloatField(widget = forms.TextInput(
                                      attrs = {'class': 'abs-field'}),
                            required = False)

    class Meta:
        model  = Point
        fields = ('graph', 'date', 'abs')  # Other fields are not edited.

    def pretty_date(self):
        return self.data.strftime('%B')

В этой точке я не знаю, как передать экземпляры класса Точки в FormSet:

def edit(request):
    PointFormSet = forms.formsets.formset_factory(PointForm, extra = 0)
    if request.method == 'POST':
        return

    # Receive 3 points to edit from the database.
    graph, res = Graph.objects.get_or_create(id = 1)
    one_day    = datetime.timedelta(days = 1)
    today      = datetime.date.today()
    do_edit    = []
    for date in [today - (x * one_day) for x in range(3)]:
        point, res = Point.objects.get_or_create(graph = graph, date = date)
        do_edit.append(point)

    formset = PointFormSet(????) # How is this initialized with the points?

Я нашел взлом, который несколько работает, но он приводит к ошибкам позже при попытке обработать получающиеся данные POST:

do_edit = []
for date in [today - (x * one_day) for x in range(3)]:
    point, res    = Point.objects.get_or_create(graph = graph, date = date)
    data          = point.__dict__.copy()
    data['graph'] = graph
    do_edit.append(data)

formset = PointFormSet(initial = do_edit)

Как это сделано правильно?

Для ссылки мой шаблон похож на это:

<form action="" method="post">
{{ formset.management_form }}
<table>
    <tbody>
    {% for form in formset.forms %}
        <tr>
            <td>{{ form.graph }} {{ form.date }} {{ form.pretty_date }}:</td>
            <td width="100%">{{ form.abs }}</td>
        </tr>
    {% endfor %}
    </tbody>
</table>
</form>
25
задан knipknap 2 January 2010 в 17:21
поделиться

1 ответ

Фокус в том, чтобы использовать "ModelFormset" вместо простого набора форм, так как они позволяют инициализировать с помощью квартета. Документы здесь , то, что вы делаете, это предоставляете форму=* при создании набора форм модели и квартет=* при инициализации набора форм. Аргумент form=* не очень хорошо документирован (пришлось немного покопаться в коде, чтобы убедиться, что он действительно там есть).

def edit(request):
    PointFormSet = modelformset_factory(Point, form = PointForm)
    qset = Point.objects.all() #or however your getting your Points to modify
    formset = PointFormset(queryset = qset)
    if request.method == 'POST':
        #deal with posting the data
        formset = PointFormset(request.POST)
        if formset.is_valid():
            #if it is not valid then the "errors" will fall through and be returned
            formset.save()
        return #to your redirect

    context_dict = {'formset':formset,
                    #other context info
                    }

    return render_to_response('your_template.html', context_dict)

Так что код проходит легко. Если запрос является GET, то инстанцированная форма возвращается пользователю. Если запрос является POST и форма является а не .is_valid(), то ошибки "проскакивают" и возвращаются в том же шаблоне. Если запрос является POST и данные действительны, то форма сохраняется.

Надеюсь, это поможет.

-Will

.
27
ответ дан 28 November 2019 в 21:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: