2016-01-12 5 views
1

Мне нужно, чтобы кнопка «Просмотр» на странице создания/редактирования admin. Когда пользователь нажимает на эту кнопку, форма должна быть сохранена и перенаправлена ​​на определенный URL-адрес, где пользователь может видеть информацию об объекте, который он только что добавил или отредактировал.Django admin Предварительный просмотр

Так что я пользовательский класс ModelAdmin с необходимыми для меня инлайн FormSets:

class InboundAdmin(admin.ModelAdmin, ListView): 
    model = Inbound 
    form = InboundForm 
    change_form_template = 'admin/tour/inbound_form.html' 
    inlines = [InboundTourDatesInline, InboundProgramInline, InboundFeedbackInline, InboundMedia, 
       InboundTourSliderPhotoInline, InboundPriceDynamicsInline] 

Шаблон проходит admin/change_form.html. Этот шаблон имеет пользовательскую кнопку:

<input type="submit" value="{% trans 'Preview' %}" class="default draft-submit" name="_save_as_draft" /> 

И этот сценарий, который:

$('.draft-submit').on('click', function(){ 
       $.ajax({ 
        type: "POST", 
        url: "{% url 'tours:inbound_draft' %}", 
        data: $("#{{ opts.model_name }}_form").serialize() 
       }); 
      }); 

Это inbound_draft вид:

def draft_inbounds(request): 
    print('inbounds') 
    form = InboundForm(request.POST or None, request.FILES or None) 
    if form.is_valid(): 
     print('is_valid') 
     form.save() 
     # Here I should return specific url with pk as an attribute. 
    print('not_valid') 

Проблема заключается в том, что при нажатии на кнопку Preview она сохраняет изменения но перенаправляет меня обратно в list_view в admin. Каков правильный способ решения моей проблемы?

ответ

2

я нашел хорошее решение, которое полностью решает мою проблему. Все, что вам нужно, это переопределить save_model(), response_change() и response_add() методы класса ModelAdmin. Вот мой класс в admin.py файла:

class InboundAdmin(admin.ModelAdmin, ListView): 
    model = Inbound 
    form = InboundForm 
    change_form_template = 'admin/tour/inbound_form.html' 
    inlines = [InboundTourDatesInline, InboundProgramInline, InboundFeedbackInline, InboundMedia, 
       InboundTourSliderPhotoInline, InboundPriceDynamicsInline] 

def save_model(self, request, obj, form, change): 
    if "_draft" in request.POST: 
     obj.published = False # If it is a draft, then post should not be published 
    else: 
     obj.published = True 
    super(InboundAdmin, self).save_model(request, obj, form, change) 

def response_change(self, request, obj): 
    if "_draft" in request.POST: 
     return HttpResponseRedirect(reverse_lazy("tours:inbound_detail", kwargs={'pk': obj.pk})) 
    else: 
     return super(InboundAdmin, self).response_change(request, obj) 

def response_add(self, request, obj, post_url_continue=None): 
    if "_draft" in request.POST: 
     return HttpResponseRedirect(reverse_lazy("tours:inbound_detail", kwargs={'pk': obj.pk})) 
    else: 
     return super(InboundAdmin, self).response_add(request, obj, post_url_continue=None) 

Если запрос содержит "_draft" затем перенаправить к необходимой URL, иначе он использует метод по умолчанию.

В шаблоне вы должны добавить кнопку для Савинса как черновик:

<input type="submit" value="{% trans 'Save as a draft' %}" class="default draft-submit" name="_draft" /> 

Это все)

1

Как вы сделали свою кнопку, вход submit, он отправляет форму, поэтому перенаправляет вас в список изменений. Для того, чтобы сделать эту кнопку «Js только», изменить его тип:

<input type="button" value="{% trans 'Preview' %}" class="default draft-submit" name="_save_as_draft" /> 

В качестве альтернативы вы можете предотвратить отправку формы с помощью JS:

$('.draft-submit').on('click', function(event){ 
    event.preventDefault(); 
    // the rest of your code 
}); 
+0

Я попытался это, но он все еще перенаправляет меня в список вида. – belek

+0

Позвольте пояснить. У вас есть форма и 'input [type =" button "]' внутри этой формы. Вы нажимаете этот ввод и перезагружаете страницу, верно? Я имею в виду, это странное поведение **. Не могли бы вы отключить JS и посмотреть, что-нибудь изменится? –

Смежные вопросы