2016-08-24 12 views
0

私は現在、複雑な管理ページを持っているプロジェクトに取り組んでいます。1つ以上のビューを持つModelAdminを作成する

現在、私が達成しようとしているのは、ユーザーがレポートを追加した後に、このレポートが多数のデータをチェックし、エリア内の人々のリストを作成する(10km未満)場合です。だから、あなたが見つけたすべての人とその電子メールを一覧表示するビューに変更ビューを保存するをクリックするとレポートを追加すると、追加する人を選択して、より多くのことをする別のボタンを押すことができます。次のように

私のコードは次のようになります。電話/ email.htmlの

admin.register(Report) 
class ReportAdmin(admin.ModelAdmin): 
    change_form_template = 'admin/phone/index.html' 
    # inlines = [SubjectInLine] 
    def response_change(self, request, obj): 
     """ 
     Determines the HttpResponse for the change_view stage. 
     """ 
     opts = self.model._meta 
     msg_dict = {'name': force_text(opts.verbose_name), 'obj': force_text(obj)} 
     context = {} 

     if "_email" in request.POST: 
      msg = _('Report Saved - Now please select the store below you would like to notify.') % msg_dict 
      self.message_user(request, msg, messages.SUCCESS) 
      payload = {'address': str(obj.location.address1) + ' ' + str(obj.location.address2)} 
      start = requests.get("https://maps.googleapis.com/maps/api/geocode/json", params=payload) 
      start = start.json() 
      start_long = start['results'][0]['geometry']['location']['lng'] 
      start_lat = start['results'][0]['geometry']['location']['lat'] 
      start_loc = (float(start_lat), float(start_long)) 
      clients = Clients.objects.filter() 
      context['report'] = obj 

      in_ten = [] 
      for c in clients: 
       payload = {'address': str(c.address1) + ' ' + str(c.address2)} 
       end = requests.get("https://maps.googleapis.com/maps/api/geocode/json", params=payload) 
       try: 
        end = end.json() 
        end_long = end['results'][0]['geometry']['location']['lng'] 
        end_lat = end['results'][0]['geometry']['location']['lat'] 
        end_loc = (float(end_lat), float(end_long)) 
        distance = vincenty(start_loc, end_loc).kilometers 
        if (distance < 10 and c.pk != obj.location.pk): 
         in_ten.append(c) 
       except: 
        print(str(c) + " Bad Address") 

      context["clients"] = in_ten 
      obj.save() 
      return render(request,'phone/email.html',context) 

     elif "_confirm-email" in request.POST: 
      print ("HELLO") 
      print (context["report"]) 
      return render(request, 'phone/email.html', context) 
     else: 
      msg = _('The %(name)s "%(obj)s" was changed successfully.') % msg_dict 
      self.message_user(request, msg, messages.SUCCESS) 
      return self.response_post_save_change(request, obj) 


    def get_actions(self, request): 
     actions = super(ReportAdmin, self).get_actions(request) 
     if 'delete_selected' in actions: 
      del actions['delete_selected'] 
     return actions 

コード:

{% extends "admin/base_site.html" %} 
{% load i18n admin_urls admin_static admin_modify %} 

{% block extrahead %}{{ block.super }} 
<script type="text/javascript" src="{% url 'admin:jsi18n' %}"></script> 
{{ media }} 
{% endblock %} 

{% block extrastyle %}{{ block.super }}<link rel="stylesheet" type="text/css" href="{% static "admin/css/forms.css" %}" />{% endblock %} 

{% block coltype %}colM{% endblock %} 

{% block bodyclass %}{{ block.super }} app-{{ opts.app_label }} model-{{ opts.model_name }} change-form{% endblock %} 


{% block content %}<div id="content-main"> 
<form {% if has_file_field %}enctype="multipart/form-data" {% endif %}action="{{ form_url }}" method="post" id="{{ opts.model_name }}_form" novalidate>{% csrf_token %}{% block form_top %}{% endblock %} 
<h1>Email Section</h1> 
    <div style="height:500px"> 
     <table> 
      <th>Location</th> 
      <th>Email</th> 
      <th>Include in Email?</th> 
      {% for c in clients %} 
      <tr> 
       <td>{{ c.name }}</td> 
       <td>{{ c.contact_email }}</td> 
       <td><input type="checkbox" name="{{c.name}}"></td> 
      </tr> 
      {% endfor %} 
     </table> 
     <div class="submit-row"> 
     <input type="submit" value="{% trans 'Email Confirmation' %}" class="default" name="_email-confirm" /> 
     </div> 
    </div> 
</form></div> 
{% endblock %} 

ですから、私は_emailボタンに気づくとき、私はその後、response_changeメソッドをオーバーライドしていることがわかります私は新しいページをレンダリングしました。今これは動作します。この新しいテンプレートがレンダリングされ、_email-confirmボタンを押すと、ページが最初からリロードされ、印刷ステートメントは表示されません。

洞察力はすばらしいでしょう。

答えて

0

だから私は、これを回避する方法を考え出し:

私はジャンゴが提供する間違った方法で働いていました。私はchange_viewを傍受し、私が望んでいたページをレンダリングするようにしてくださいましたでしたどのようなので、ここで

def change_view(self, request, object_id, form_url='', extra_context=None): 
    context = {} 
    if "_email-confirm" in request.POST: 
     print ("CONFIRM") 
     return render(request,'phone/confirm.html',context) 
    if "_continue" in request.POST: 
     print ("CONTINUE") 
     ''' 
     obj = Report.objects.get(pk=object_id) 
     payload = {'address': str(obj.location.address1) + ' ' + str(obj.location.address2)} 
     start = requests.get("https://maps.googleapis.com/maps/api/geocode/json", params=payload) 
     start = start.json() 
     start_long = start['results'][0]['geometry']['location']['lng'] 
     start_lat = start['results'][0]['geometry']['location']['lat'] 
     start_loc = (float(start_lat), float(start_long)) 
     clients = Clients.objects.filter() 
     context['report'] = obj 
     in_ten = [] 
     for c in clients: 
      payload = {'address': str(c.address1) + ' ' + str(c.address2)} 
      end = requests.get("https://maps.googleapis.com/maps/api/geocode/json", params=payload) 
      try: 
       end = end.json() 
       end_long = end['results'][0]['geometry']['location']['lng'] 
       end_lat = end['results'][0]['geometry']['location']['lat'] 
       end_loc = (float(end_lat), float(end_long)) 
       distance = vincenty(start_loc, end_loc).kilometers 
       if (distance < 10 and c.pk != obj.location.pk): 
        in_ten.append(c) 
        print (c.address) 
      except: 
       print(str(c) + " Bad Address") 

     context["clients"] = in_ten 
     ''' 
     return render(request,'phone/email.html',context) 
     #return super(ReportAdmin, self).change_view(request, object_id, 'phone/email.html', context) 
    else: 
     return super(ReportAdmin, self).change_view(request,object_id,form_url) 

:私はこれをしなかった

方法がでました。

他人に役立つことを願っています。

関連する問題