web-dev-qa-db-ja.com

Django:反復不可能なintオブジェクトをアンパックできません

私はDjangoとPythonを学習しています。フォームに問題があります。

エラーは「/ My_appのTypeError」であり、「反復不可能なintオブジェクトをアンパックできません」

これは私の見解です:

from Django.http import HttpResponse, Http404
from Django.shortcuts import redirect, render, get_object_or_404
from datetime import datetime

from Qualite.forms import NCForm
from Qualite.models import NC, Nc_type, Poste

def view_accueil(request):

    form = NCForm(request.POST or None)

    if form.is_valid():
        newNc = NC()
        newNc.idaffaire = form.cleaned_data['idaffaire']
        newNc.idnc = form.cleaned_data['idnc']
        newNc.idof = form.cleaned_data['idof']
        newNc.idposte = form.cleaned_data['idposte']
        newNc.idrepere = form.cleaned_data['idrepere']
        newNc.iquantite = form.cleaned_data['iquantite']
        newNc.save()

    return render(request, 'Qualite/accueil.html', locals())

私のフォーム:

from Django import forms
from .models import Nc_type, NC, Poste

class NCForm(forms.Form):

    #choices = NC.objects.values_list('id', 'idaffaire')
    ncs = NC.objects.values_list('idaffaire', flat = True)

    idaffaire = forms.ChoiceField(choices = (ncs))
    idof = forms.CharField()
    idrepere = forms.CharField()
    idposte = forms.CharField()
    idnc = forms.CharField()
    quantite = forms.CharField()

そして私のモデル

from Django.db import models
from Django.utils import timezone

class Nc_type(models.Model):
    nom = models.CharField(max_length=30)

    def __str__(self):
        return self.nom

class Poste(models.Model):
    nom = models.CharField(max_length=50)

    def __str__(self):
        return self.nom


class NC(models.Model):
    idaffaire = models.CharField(max_length=4, db_column='idAffaire')
    idof = models.IntegerField(db_column='idOf')
    idposte = models.ForeignKey('Poste', models.DO_NOTHING, db_column="idPoste", default=1)
    idrepere = models.IntegerField(db_column='idRepere')
    idnc = models.ForeignKey(Nc_type, models.DO_NOTHING, db_column='idNc_type', default=1)
    quantite = models.PositiveIntegerField()
    dateajout = models.DateTimeField(default=timezone.now, db_column='dateAjout')

そしてテンプレート:

<h1>Ajout d'une NC</h1>

<form action="{% url "accueil" %}" method="GET">
    {% csrf_token %}
    {{ form }}
    <input type="submit" value="Submit" />
</form>

それは私が問題を理解するのを助ける誰かです。 Webで解決策を検索しましたが、方法がありませんでした。

2
ROGGY QUENTIN

問題は、次のようなクエリです。

ncs = NC.objects.values_list('idaffaire', flat=True)

ncsintオブジェクトのインタラブルになります。ただし、choicesChoiceFieldには、2-tuplesのリストが必要です。これらの2つのタプルの最初の項目としてキーがあり、ラベル2タプルの2番目の項目として。

それでも、クラスレベルでクエリを使用することは良い考えではありません。これは、クラスがロードされた状態でクエリが実行されることを意味します。つまり、後でNCオブジェクトを追加した場合、フォームはこれを新しい選択肢として提供しません。

ModelForm[Django-doc] を使用することもお勧めします。特にidpostePosteオブジェクトに有効な値を使用する必要があるため、多くのボイラープレートコードを削除します。ここではフォームでそれを検証できません。

次に、フォームを次のように実装できます。

from Django import forms
from .models import NC

class NCForm(forms.ModelForm):
    class Meta:
        model = NC
        fields = '__all__'

次に、views.py、このフォームは次で使用できます。

from Django.shortcuts import redirect

def view_accueil(request):
    if request.method == 'POST':
        form = NCForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('name-of-a-view')
    else:
        form = NCForm()
    return render(request, 'Qualite/accueil.html', {'form': form})

:POSTリクエストが成功した場合、 redirect[Django-doc]Post/Redirect/Getpattern [wiki] 。これにより、ユーザーがブラウザを更新したときに、同じPOSTリクエストを行うことを回避できます。

0

答えてくれてありがとう。こんな方がいいです。もう1つ質問があります。リダイレクトとGetパターンに関するあなたの答えがわかりません。実際、フォームを送信すると、NoReverseMatchのようなエラーが発生しました。

0
ROGGY QUENTIN