Django - Открыть форму создания / добавления с предварительно скомпилированными полями на основе другой объектной модели - PullRequest
0 голосов
/ 18 февраля 2019

В моем проекте я использую администратор Django с Django 1.11, поэтому у меня есть modelA и modelB, и пользователи могут создавать их оба, но иногда мне нужно создать объект modelA с полем некоторых значений на основе объекта modelB.

Чтобы сделать это, я переопределил мой шаблон /templates/my_app_name/my_modelB/change_form.html и добавил кнопку, подобную этой:

{% extends "admin/change_form.html" %}
{% load i18n admin_urls %}
{% block object-tools-items %}

      <div class="form-row form-row-field-quick-view">
            <a href="create_object_A_view">Create ObjA from this ObjB</a>
      </div>

    {% endif %}
{% endblock %}

Таким образом, когда я открываю некоторую форму изменения ObjB, я получаюссылка, основанная на представлении, задачей которого является перенаправление пользователей на url / admin / app_name / modelA / add / и отображение правильной формы с некоторыми полями, предварительно скомпилированными на основе значений ObjB, из которых получена форма.Поэтому я создал вид, подобный следующему:

class create_object_A_view(View):
    model = ModelA

    url = '/admin/app_name/modelA/add/'

    def get(self, request, *args, **kwargs):

       #get data from objB, say it foo and bar....
       form = ModelAForm(initial={'field1': 'foo' , 'field2':'bar'})

        return redirect(self.url,
            {'form':form,
            'opts': self.model._meta,
            'change': False,
            'is_popup':False,
            'save_as':False,
            'has_delete_permission':False,
            'has_add_permission': False,
            'has_change_permission':  False})

При этом я получаю правильное перенаправление на / admin / имя_приложения / modelA / add /, но поля, которые я хочу предварительно скомпилировать, пусты.

Это правильный способ достижения этого результата?

1 Ответ

0 голосов
/ 18 февраля 2019

Вы можете сделать это, перенаправив на модель A, добавив URL с данными формы в самом URL

, например:

return redirect(self.url+"?"+form.data.urlencode())
...