[PYTHON] Progression des recommandations de collations (mémo)

Chose que tu veux faire

Ce que je n'ai pas pu faire

Formulaire de quiz (créer un bouton radio) + sélectionner au hasard les collations affichées dans le quiz à chaque fois +

image.png

forms.py



ns = random.sample(range(15,83), 9)

def decide_coice(count, CHOICE_dict):
    CHOICEs = {
        (ns[count*3], CHOICE_dict[ns[count*3]]),
        (ns[count*3+1], CHOICE_dict[ns[count*3+1]]),
        (ns[count*3+2], CHOICE_dict[ns[count*3+2]])
    }
    return CHOICEs

CHOICESAKE = {
    (1,'1'),
    (2,'2'),
    (3,'3'),
}
CHOICE_dict = {
    15:'Type de salade',
    16:'Bâtonnet de légumes',
    (Abréviation)
    82: 'Glace aux fruits',
}
CHOICE = {
    (15,'Type de salade'),
(Omis)
    (82, 'Glace aux fruits'),
}

class RadioForm(forms.Form):
    select = forms.ChoiceField(label='Alcool', widget=forms.RadioSelect, choices= CHOICESAKE, initial=2)
    select2 = forms.ChoiceField(label='Attribut 2', widget=forms.RadioSelect, choices= decide_coice(0, CHOICE_dict), initial=15)
    select3 = forms.ChoiceField(label='Attribut 3', widget=forms.RadioSelect, choices= decide_coice(1, CHOICE_dict), initial=15)
    select4 = forms.ChoiceField(label='Attribut 4', widget=forms.RadioSelect, choices= decide_coice(2,CHOICE_dict), initial=15)


Écrivez le processus de réception des entrées dans des formulaires. CHICE et CHICE_dict sont destinés à faciliter le traitement. Il y a toujours moyen de bien le gérer avec un seul. Puisque le processus de classification de la liqueur n'est pas encore terminé à partir de l'image, la valeur de la liqueur est donnée par CHOICE SAKE. Je veux donner le nombre de saké ici.

Un nombre aléatoire est généré et le bouton correspondant à ce nombre est affiché sous forme de quiz.

Recevez les résultats des quiz à la réception

frontend/views.py


def new(request):
    params = {'message': '', 'form': None}
    if request.method == 'POST':
        #form = QuizForm(request.POST)
        form = RadioForm(request.POST)
        if form.is_valid():
            """
            redirect_url = '/newview'
            form = urlencode(QuizForm(request.POST))
            url = f'{redirect_url}?{form}'
            return redirect(url)
            """
            
            key = (int(form.data['select']), int(form.data['select2']), int(form.data['select3']), int(form.data['select4']))
            return recommend(request, key[0], key[1], key[2], key[3])
            

        else:
            params['message'] = 'Veuillez saisir à nouveau'
            params['form'] = form
    else:
        params['form'] = RadioForm()
    return render(request, 'frontend/new.html', params)

Il a créé une page pour un quiz, mais je ne supportais pas d'y toucher, alors j'ai créé un quiz avec du nouveau. form = RadioForm (request.POST) '' et form '' contient le résultat du quiz avec Queryset type. Si la valeur est normale lors de l'envoi du quiz, appuyez sur `` return recommend (request, key [0], key [1], key [2], key [3]) '' pour passer au processus suivant.

J'ai un problème

Je voulais vraiment aller sur ** frontend / recommend ** et afficher le résultat, mais je ne savais pas comment passer des données json.

Il semble que les deux peuvent être réalisés, alors j'ai choisi le second. Par conséquent, le traitement est toujours effectué à l'URL de _ / new_. J'ai également implémenté le troisième. Tous les arguments sont int, et ce nombre sort en premier et correspond au nombre CHOICE. retour recommandé (demande, numéro d'alcool, collation numéro 1, collation numéro 2, collation numéro 3)

Prédire les boutons en utilisant les résultats du quiz

Le flux de traitement est le suivant


    1. Récupération de données hautement cotées pour l'alcool sélectionné par l'utilisateur findameperson ()
  1. Calculer la similarité en référence au bouton sélectionné par l'utilisateur `` get_simirality () ''
    1. Trier par similarité et par rang `` predire () ''

views.py


quizAnser = [CHOICE_dict[one+3], CHOICE_dict[two], CHOICE_dict[three], CHOICE_dict[four]]

    #Cibler les données obtenues à partir d'images et de quiz
    target_sake = target_items_list[one+3]
    first_otsumami = {target_items_list[two] : two}
    second_otsumami = {target_items_list[three] : three}
    target_data = [first_otsumami, second_otsumami]
    sample_lists = list(Sample.objects.all().values())


    #Obtenez des exemples de données de personnes ayant une évaluation élevée du saké sélectionné
    samePersonList = findsamePerson(target_sake, sample_lists)

    #Calculer la similitude
    similarities = get_similarities(samePersonList, target_data)

    #Classement
    ranking = predict(samePersonList, similarities, target_items_list, CHOICE_dict)

    params = {
        'title': 'title',
        'massage': similarities,
        'Type d'alcool':quizAnser[0],
        'Collation 1':quizAnser[1],
        'Collation 2':quizAnser[2],
        'Collation 3':quizAnser[3],
        'Première place':ranking[0][0],
        'quizAnser': quizAnser,
        'data': ranking,
    }
    return render(request, 'frontend/recommend.html', context=params)

def findsamePerson(target_sake, sample_lists):#(str, list[dict])
    #Extraire des échantillons avec une cote d'alcool cible de 5
    #Mettre les données (type dictionnaire) des personnes ayant une évaluation élevée dans la même liste

    samePersonList = []
    for item in sample_lists:
        if item[target_sake] >= 3:
            samePersonList.append(item)
        else:
            pass
    return samePersonList

Envoyer et afficher le classement prévu à la réception

vies.py


    params = {
        'title': 'title',
        'massage': similarities,
        'Type d'alcool':quizAnser[0],#str
        'Collation 1':quizAnser[1],#str
        'Collation 2':quizAnser[2],
        'Collation 3':quizAnser[3],
        'Première place':ranking[0][0],#str
        'quizAnser': quizAnser,#Liste des noms de résultats d'entrée(str)[Saké, Otsu 1, Otsu 2, Otsu 3]
        'data': ranking,#liste de dict=[{Nom de la collation 1:Degré de similitude},{Nom de la collation 2:Degré de similitude}...]Degré de similitudeでソート済み
    }
    return render(request, 'frontend/recommend.html', context=params)

La clé (à gauche) des paramètres est l'étiquette qui peut être utilisée en html, et la valeur (à droite) est le contenu réel

frontend/recommend.html


                        <h2>Votre collation aujourd'hui est ...</h2>
                        <img src="{% static 'frontend/img/result/salad.jpg' %}">
                        <h2>{{Première place}}!!!</h2>
                        <br>
                        <p>{{Type d'alcool}}Parfait pour{{Première place}}est.<br>
                            <br>
En plus des salades, les ingrédients suivants sont également recommandés.<br>
Si vous n'êtes pas doué pour les salades ou si vous souhaitez manger d'autres collations, veuillez vous y référer.</p>

                    </div>

                    {% for item, similarities in data %}
                    <p>
                        {{forloop.counter}}Rang:{{item}}【point】: {{similarities}}
                    </p>

                    {% endfor %}

Vous pouvez afficher la valeur des paramètres avec {{key}}, et vous pouvez utiliser la fonction python avec {%%}, donc vous faites une boucle. ↓ Écran de sortie image.png

Enregistrer le questionnaire dans la base de données

C'est une tâche infernale de taper manuellement. Actuellement, seulement 20 environ peuvent être enregistrés Je vais le faire en regardant un film

Je vais manger des ramen. S'il y a des choses étranges ou des améliorations, veuillez demander sur Slack! J'ai du temps demain!

Le site que j'ai vu

Comment rediriger en utilisant Django et JavaScript (JS) Envoyer et recevoir du JSON avec Django Json sur Django [Django] Installer les boutons radio et formater les balises Redirection en passant des paramètres (https://djangobrothers.com/blogs/django_redirect_with_parameters/) Supprimer la base de données du modèle (ModelChoiceField) Afficher un bouton radio qui fait référence à un autre modèle sur l'écran d'inscription (Django) Je ne comprends pas la logique de la transition d'écran how to convert Querydict to python dict informations de base sur le formulaire Générer un formulaire à partir d'un modèle

Recommended Posts

Progression des recommandations de collations (mémo)