2010-08-31 29 views
8

Tôi quan tâm đến việc tạo hành động cho giao diện quản trị yêu cầu một số thông tin bổ sung ngoài các mục được chọn. Ví dụ của tôi là thêm hàng loạt truyện tranh vào hàng loạt. (Có, tôi biết câu trả lời rõ ràng là tạo một lược đồ với các mối quan hệ X-to-X, nhưng với tôi vì một ví dụ đơn giản).Django: Cách tạo hành động quản trị phức tạp yêu cầu thông tin bổ sung?

Trong ví dụ này, tôi đã tạo 100 truyện tranh. Sau khi chúng được tạo ra, tôi muốn kết hợp chúng với một đối tượng chuỗi đã được tạo ra. Để thực hiện hành động này trong quản trị viên, tôi muốn chọn các mục sau đó bắt đầu hành động. Sau đó tôi sẽ được hỏi đối tượng chuỗi nào để sử dụng (thông qua cửa sổ bật lên, biểu mẫu trung gian, v.v.).

Tôi đã làm theo các hướng dẫn here yêu cầu thực hiện điều này thông qua biểu mẫu trung gian. Sau khi làm việc với nó, tôi không nhận được bất kỳ lỗi nào nhiều hơn, nhưng bản thân hành động cũng không được thực hiện - hoặc vòng forloop không bao giờ được thực hiện. Thay vào đó, nó trở lại danh sách quản trị truyện tranh với thông báo: "Không có hành động nào được chọn".

phương pháp admin.py tôi:

from django.shortcuts import render_to_response 
from django.template import RequestContext 
from django.http import HttpResponseRedirect 
def addSeries(self, request, queryset): 
    form = None 
    if 'cancel' in request.POST: 
     self.message_user(request, 'Canceled series linking.') 
     return 
    elif 'link_series' in request.POST: 
     form = self.SeriesForm(request.POST) 
     if form.is_valid(): 
      series = form.cleaned_data['series'] 
      for x in queryset: 
       y = Link(series = series, comic = x) 
       y.save() 
      self.message_user(request, self.categorySuccess.render(Context({'count':queryset.count(), 'series':series}))) 
      return HttpResponseRedirect(request.get_full_path()) 
    if not form: 
     form = self.SeriesForm(initial={'_selected_action': request.POST.getlist(admin.ACTION_CHECKBOX_NAME)}) 
    return render_to_response('setSeries.html', {'comics': queryset, 'form': form, 'path':request.get_full_path()}, context_instance=RequestContext(request)) 
addSeries.short_description = 'Set Series' 

hình thức trung gian của tôi setSeries.html:

<!DOCTYPE html> 
<html> 
    <head> 
     <title>Create Series Links</title> 
    </head> 
    <body> 
     <h1>Create Series Links</h1> 
     <p>Choose the series for the selected comic(s):</p> 
     <form method="post" action="{{ path }}"> 
      <table> 
       {{ form }} 
      </table> 
      <p> 
       <input type="hidden" name="action" value="changeSeries" /> 
       <input type="submit" name="cancel" value="Cancel" /> 
       <input type="submit" name="link_series" value="link_series" /> 
      </p> 
     </form> 
     <h2>This categorization will affect the following:</h2> 
     <ul> 
      {% for comic in comics %} 
       <li>{{ comic.title }}</li> 
      {% endfor %} 
     </ul> 
    </body> 
</html> 

Trả lời

5

Một điều tôi nhận thấy là phương pháp của hành động của bạn là “addSeries”, nhưng theo hình thức bạn đang gọi nó là "changeSeries".

Trong ModelAdmin của bạn, bạn nên có một dòng như sau:

actions = ['addSeries'] 

Nếu đó là dòng bạn có, thì bạn cần phải thay đổi:

<input type="hidden" name="action" value="changeSeries" /> 

tới:

<input type="hidden" name="action" value="addSeries" /> 

Đó là cách quản trị viên của Django biết hành động nào đã được chọn. Khi bạn có biểu mẫu trung gian giữa việc chọn hành động và thực hiện hành động, bạn sẽ cần phải duy trì tên hành động từ menu chọn trên giao diện quản trị.

+0

Cảm ơn bạn! Điều đó khiến mọi thứ hoạt động hoàn hảo. – tjw

Các vấn đề liên quan