@Kacianov

Как сохранить данные из форм в БД?

Всем привет.
Имеется форма
class MarkForm(ModelForm):
    value = CharField(max_length=1, widget=TextInput())
    class Meta:
        model = Mark
        fields = ['value']

Она же выводиться в некотором количестве в шаблон с помощью template tag:
@register.assignment_tag(takes_context=True)
def add_mark(context):
    mark = Mark.objects.get(pupil=context['pupil'],
                            lesson=context['lesson'])
    form = MarkForm(initial={'value': mark.value},
                    prefix=mark.id)
    return form

{% for lesson in lessons %}
{% add_mark as form %}
<td>{{ form.value }}</td>
{% endfor %}

Необходимо сохранить (обновить) каждую из форм в соответствующий объект:
class Mark(models.Model):
    value = models.CharField(max_length=1, verbose_name='Оценка',
                             blank=True, default='',
                             choices=MARKS)
    pupil = models.ForeignKey(Pupil, verbose_name='Ученик')
    lesson = models.ForeignKey(Lesson, verbose_name='Занятие')


Единственным возможный способ, который мне приходит в голову, - идентификация по prefix/primary key, но как это реализовать на практике ума не приложу. Предположу, что есть еще варианты.
Update: Вьюшка
context_object_name = 'lessons'
    def get_context_data(self, **kwargs):
        context = super(TableListView, self).get_context_data(**kwargs)
        context['group'] = Group.objects.get(pk=self.kwargs['group'])
        context['subj'] = self.kwargs['subj']
        context['year'] = self.kwargs['year']
        context['month'] = self.kwargs['month']
        return context
  • Вопрос задан
  • 1296 просмотров
Пригласить эксперта
Ответы на вопрос 2
@marazmiki
Укротитель питонов
Мне почему-то вспомнилось про формсеты.

И ещё деталь: вот этот код (безотносительно формсетов)

@register.assignment_tag(takes_context=True)
def add_mark(context):
    mark = Mark.objects.get(pupil=context['pupil'],
                            lesson=context['lesson'])
    form = MarkForm(initial={'value': mark.value},
                    prefix=mark.id)
    return form


лучше переписать вот так:

@register.assignment_tag(takes_context=True)
def add_mark(context):
    request = context['request']
    mark = Mark.objects.get(pupil=context['pupil'],
                            lesson=context['lesson'])
    form = MarkForm(request.POST or None, prefix=mark.id,
                    instance=mark)
    return form


а именно — передавать в форму связанный с ней объект (аргумент instance). Ну и передавать POST-данные в форму, если они есть.
Ответ написан
Комментировать
un1t
@un1t
Непонятно зачем форма засунута в assignment_tag
Обычно этот код расположен во вьюхе и при post сохраняется form.save()

В любом случае должна быть вьюха куда отправляется пост запрос с этой формы.
И там нужно инициализирваоть эту форму с учетом данных из request.POST, и сохранить form.save()
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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