Создание формы модели со значениями по умолчанию из вида - PullRequest
0 голосов
/ 11 июня 2019

Я пишу простое приложение «Повестка дня» для управления событиями, где игроки могут создавать таблицы и присоединяться к ним, чтобы играть в игры.У меня есть две связанные модели: Event и Table.

Пока у меня работают следующие вещи: - подробный вид события, перечисляющий все его таблицы, есть действие ajax, позволяющее пользователям присоединяться / выходить из каждой таблицы.- простая форма (ModelForm) со связанным с ней представлением, позволяющим пользователю создать таблицу в событии

. Я хотел бы добавить к подробному виду события кнопку, которая будет запускать форму создания таблицы с событиематрибут уже установлен на это конкретное событие (и не подлежит изменению), и после отправки формы вернитесь к подробному представлению о событии

Что было бы наилучшим способом достижения этого.До сих пор я нашел только частичные отведения, которые не сработают

Я пытался добавить кнопку ajax в шаблоне сведений о событии, ссылающемся на представление создания таблицы, посылая идентификатор события, чтобыview может получить объект события.Из журнала, который я получаю, он попадает в представление создания таблицы, но функция рендеринга не вызывает шаблон создания таблицы.

Я также пытался включить шаблон формы создания таблицы в подробности событияшаблон и переместите код из представления создания таблицы в представление сведений о событии.Но затем я получаю сообщение об ошибке из функции сохранения формы, которая не может найти атрибут события в объекте экземпляра (я добавил его в методе init , с kwargs)

models.py

class Table(models.Model):
    ...
    event = models.ForeignKey(Event,
                              on_delete=models.CASCADE,
                              related_name='tables',
                              null=True)
    ...

forms.py

class TableCreateForm(forms.ModelForm):
    class Meta:
        model = Table
        fields = (
        ...
        )

    def __init__(self, *args, **kwargs):
        self.event = kwargs.pop('event')
        logger.info("save _%s_", self.event)
        super().__init__(*args, **kwargs)

    def save(self, *args, **kwargs):
        if self.instance.pk:
            return super(TableCreateForm, self).save()

        instance = super(TableCreateForm, self).save(commit=False)
        instance.event = kwargs.pop('event')
        logger.info("save _%s_", instance.event)
        instance.slug = slugify(instance.title + ' ' + str(int(instance.event.tables.order_by('slug').reverse().first().slug)+1))
        instance.save()

        return instance

views.py

def event_detail(request, year, month, day, event):
    event = get_object_or_404(Event,
                              slug=event,
                              status='à venir',
                              date__year=year,
                              date__month=month,
                              date__day=day)

    if request.method == 'POST':
        logger.info("table_create _%s_", event.id)
        table_form = TableCreateForm(data=request.POST, event=event)
        logger.info("__init__ _%s_", table_form.event.id)
        if table_form.is_valid():
            obj = table_form.save()
            obj.manager = request.user
            obj.save()
            messages.success(request, 'Table mise à jour '
                                      'avec succès')
        else:
            messages.error(request, 'Erreur lors de la mise à jour '
                                    'de la table')
    else:
        logger.info("table_create action %s,  _%s_", request.method, event.id)
        table_form = TableCreateForm(event=event)

    logger.info("Out _%s_", request.method)

    return render(request,
                  'agenda/event/event_detail.html',
                  {'event': event,
                   'table_form': table_form})

urls.py

urlpatterns = [
    path('<int:year>/<int:month>/<int:day>/<slug:event>/',
         views.event_detail,
         name='event_detail'),
    path('table_create/', views.table_create, name='table_create'),
]

event_detail.html

...
<table>
    <tr>Nouvelle table</tr>
    <tr>{% include 'agenda/table/table_create.html' %}</tr>
</table>
...

table_create.html.html

  <form action="." method="post">
    {{ table_form.as_table }}
    {% csrf_token %}
    <p><input type="submit" value="Valider"></p>
  </form>

Журналы из методов инициализации и сохранения формы varegueapp_1 |ИНФОРМАЦИЯ: повестки дня. Просмотров: init 3 varegueapp_1 |ИНФОРМАЦИЯ: повестки дня: формы: СОХРАНИТЬ Нет

Функция инициализации действительно получает доступ к объекту события (event.id равен 3), но тогда функция сохранения не ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...