2017-03-25 11 views
0

セロリタスクでフォームを処理していて、HttpResponseRedirectの後にレンダリングすることができます。Celeryタスクを使用したDjangoビュー:2つのパラメータを使用したレンダー詳細ページ

ここに私のviews.py中:

from django_celery_results.models import TaskResult 
from .forms import SampleForm 
from .models import Sample 
from analysis.tasks import process_sample_input 

def sample_submit(request): 
    if request.method == "POST": 
     form = SampleForm(request.POST or None, request.FILES or None) 
     if form.is_valid(): 
      #form = form.cleaned_data 
      instance = form.save() 
      task = process_sample_input.delay(instance.id) 
      try: 
       task_result = TaskResult(task_id = task.id) 
       task_result.save() 
       return HttpResponseRedirect(reverse("sample:results_detail", kwargs={"id":instance.id, "task_id":task.id})) 
      except Exception as e: 
       raise e 
      #return results_detail(request, instance.id, task.id) #show the results details 

     else: 
      print form.errors 
      return not_processed(request) 
    else: 
     form = SampleForm() 
    context = { 
     "form": form, 
    } 
    return render(request, "analysis/sample_form.html", context) 

私の問題は、私は結果一覧ページからresults_detailによってレンダリングされたHTMLにアクセスする方法です。私は他の場所から私のセロリのタスクのIDにアクセスできる方法がわからない、私のviews.py内のビューsample_submit()

:で私のresults_list.html

{% block content %} 
<table> 
    <thead> 
     <tr> 
      <th>Name [Local File or URL]</th> 
     </tr> 
    </thead> 
    {% for sample in all_samples %} 
     <td><a href='/sample/results/{{sample.id}}/'>{{ sample.get_sample_name }}</a></td> 
    {% endfor %} 
</table> 
{% endblock %} 

def results_list(request): 
    all_samples = Sample.objects.all() 
    context = {'all_samples': all_samples} 
    return render(request, "analysis/results_list.html", context) 

myappに/分析/ urls.py:

url(r'^results/(?P<id>[0-9]+)/$', views.results_detail, name="results_detail"), 
urls.pyでここ

やテンプレート、私はC言語1つのパラメータのみを渡します。方法がある場合、セロリのtaskresult id(自動生成)をビューに渡すにはどうすればよいですか?どんな助けやアイデア?

答えて

0

2つのパラメータを渡すことは難しいため、私はちょうどtaskresult.idと同じ私のアプリケーションモデルのIDを持つことに決めました。ビューにアクセスする方が簡単です:

def results_detail(request, id=1): 
    sample_instance = get_object_or_404(Sample, id = id) 
    result_obj = None 
    try: 
     result_obj = TaskResult.objects.get(id=id) 
    except Exception as e: 
     raise e 
    try: 
     #AsyncResult waits for the Celery task results to finish and return results 
     taskresult = AsyncResult(result_obj.task_id) 
     # --- Accessing AsyncResult's results for Thug logs --- 
     #ast.literal_eval for reading the list in a string 
     if taskresult.get(): 
      #did this to make sure results are already available. Manually asking django-celery-taskresult's object.status returns PENDING. taskresult.get() will wait for the task. 
      # include next code here 
関連する問題