Django: Как я могу использовать ответ, возвращаемый функцией form_valid () CreateView для другой модели в новом шаблоне? - PullRequest
0 голосов
/ 27 июня 2019

Я изучаю Джанго, и я уверен, что решение очень простое, но я не могу его найти;У меня есть модель "профиль", который должен быть отфильтрован по запросу.Запросы и ответы должны храниться в базе данных.Но я не хочу, чтобы пользователь видел все профили в любой момент.
Поэтому я написал две модели: первая содержит запросы (MyRequest), вторая - потенциальные ответы (Profile).Профили создаются импортируя CSV в админке Django.Я написал код, который работает нормально, НО я не могу понять, как отправить свой ответ в шаблоне, чтобы использовать все настройки и ценные бумаги как csrf_token.

В настоящее время он показывает ответ в том же URL, чемзапрос и я там заблокирован

Я пытался использовать get_succes_url с HttpResponseRedirect, обычно я могу делать такие вещи, используя (? P \ d +) / $ 'в URL успеха, но это может не сработать, возможно, потому чтодве модели не имеют общего ключа?Я попытался ввести URL-адрес, но я думаю, что сделал что-то не так

"""Models"""
class Profile(models.Model):#probgerme probpvt probservice probATCDpvt probATCDbmr probNB
    profname= models.CharField(max_length=20)
    bq = models.ForeignKey(Bq, on_delete=models.CASCADE)#, blank=True
    test1 = models.CharField(max_length=100)
    test2 = models.CharField(max_length=100)
    test3 = models.CharField(max_length=100)

class MyRequest(models.Model):#probgerme probpvt probservice probATCDpvt probATCDbmr probNB
    reqname = models.CharField(max_length=20)
    bq = models.ForeignKey(Bq, on_delete=models.CASCADE)
    user = models.ForeignKey(settings.AUTH_USER_MODEL,default=0, related_name="user2")
    test1 = models.CharField(max_length=100)
    test2 = models.CharField(max_length=100)

"""Forms"""
class MyRequestCreateForm(forms.models.ModelForm):
    class Meta:
        model = MyRequest
        fields = ('bq','test1','test2')
    def save(self, *args, **kwargs):       
        myrequest = super().save(*args, **kwargs)
        myrequest.save()

"""URL """
url(r'^essai_create/$', views.MyRequestCreateView.as_view(), name='my_request'),


"""Views"""
class MyRequestCreateView(LoginRequiredMixin, generic.CreateView): 
    form_class = MyRequestCreateForm
    model = MyRequest
    def get_queryset(self):      
        queryset = super().get_queryset().filter(user=self.request.user)
        return queryset

    def get_form(self, form_class=None):
       form = super().get_form(form_class)
        form.fields['test1'].required = True 
        return form

    def form_valid(self, form):
        form.instance.user = self.request.user 
        self.object = form.save()
        data = form.cleaned_data
        test1 = data['test1']
        test2 = data['test2']

        print('data',data)
        try:
            Profile.objects.get(test1 = test1, test2 = test2 )
            tested3= Profile.objects.get(test1 = test1, test2 = test2).test3.split(',')

        except ObjectDoesNotExist:
            tested3 = ['nothing']*5           

        reponse = "Votre requête : test1 = " + test1 + ", test2 = " + test2 +    "<br>val1, "+tested3[0] + "<br>val2, "+tested3[1] + "<br>val3 " + tested3[2]+ "<br>val4, " + tested3[3]
        return HttpResponse(reponse)

"""Template myrequest_form.html"""

{% extends 'base2.html' %}
{% load bootstrap %}
{% load crispy_forms_tags %}
{% load static %}
{% block content %}

<div class="container ">
  <form method="POST" enctype="multipart/form-data" id="project-form">
    {% csrf_token %}


    <form method="post" >
    {% csrf_token %}
    {{ form.bq|as_crispy_field }}
    <br>
      <div class="col-6">
        Information sur le test1 {{ form.test1 }} <br>
      </div>
        <br>
      <div class="col-6">
        Information sur le test2 {{ form.test2 }}<br>
      </div>
        <br>

<br><br>
         <button id = "submitRequest" aria-pressed="true" class="btn btn-primary active" onclick="showPleaseWait()"  type="submit"   >Check for best answer</button>
  </form>


  </form>
</div>
{% endblock %}

В настоящее время после нажатия кнопки «Проверить лучший ответ» в шаблоне, открытом в http://localhost:8000/myapp/essai_create/, этот же URL-адрес http://localhost:8000/myapp/essai_create/ показывает:
Голосование: test1 = nouveau, test2 = Rouge
val 1, 7
val 2, 12
val 3, 4
val 4, 5

Ответы [ 2 ]

0 голосов
/ 04 июля 2019

@ Даниэль Роузман (создание простого представления ProfileDetail) - это здорово!Мне нужно было только изменить путь (я использую Django 2.11) для

url(r'profiledetail/(?P<pk>\d+)$', views.ProfileDetail.as_view(), name='profile')

и мне нужно было изменить createview

def form_valid(self, form):
    form.instance.user = self.request.user 
    self.object = form.save()
    data = form.cleaned_data
    test1 = data['test1']
    test2 = data['test2']
    profile=ProbasProfile.objects.get(test1 = test1, test2=test2)
    return redirect('profile', pk=profile.id)

, затем в новом шаблоне, созданном для ответа

{{profile.test1}}{{profile.test2}}{{profile.test3}}

и, конечно, класс ProfileDetail, как он его написал

0 голосов
/ 02 июля 2019

Мне все еще трудно понять, чего ты хочешь, к сожалению.Возможно, вам нужно найти Профиль, соответствующий представленным данным, а затем перенаправить на него?В этом случае вам нужно сделать это перенаправление внутри form_valid и определить DetailView для профиля, на который вы перенаправляете.Итак:

class MyRequestCreateView(LoginRequiredMixin, generic.CreateView): 
    ...
    def form_valid(self, form):
        form.instance.user = self.request.user 
        obj = form.save()
        try:
            profile = Profile.objects.get(test1=obj.test1, test2=obj.test2)
            return redirect('profile', pk=profile.id)
        except Profile.DoesNotExist:
            return redirect('/')   # or wherever

class ProfileDetail(LoginRequiredMixin, generic.DetailView):
    model = Profile

и URL:

path('profile_detail/<int:pk>', ProfileDetail, name='profile')
...