В моем проекте я использую администратор 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 /, но поля, которые я хочу предварительно скомпилировать, пусты.
Это правильный способ достижения этого результата?