私は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で解決策を検索しましたが、方法がありませんでした。
問題は、次のようなクエリです。
ncs = NC.objects.values_list('idaffaire', flat=True)
ncs
はint
オブジェクトのインタラブルになります。ただし、choices
のChoiceField
には、2-tuplesのリストが必要です。これらの2つのタプルの最初の項目としてキーがあり、ラベル2タプルの2番目の項目として。
それでも、クラスレベルでクエリを使用することは良い考えではありません。これは、クラスがロードされた状態でクエリが実行されることを意味します。つまり、後でNC
オブジェクトを追加した場合、フォームはこれを新しい選択肢として提供しません。
ModelForm
[Django-doc] を使用することもお勧めします。特にidposte
はPoste
オブジェクトに有効な値を使用する必要があるため、多くのボイラープレートコードを削除します。ここではフォームでそれを検証できません。
次に、フォームを次のように実装できます。
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リクエストを行うことを回避できます。
答えてくれてありがとう。こんな方がいいです。もう1つ質問があります。リダイレクトとGetパターンに関するあなたの答えがわかりません。実際、フォームを送信すると、NoReverseMatchのようなエラーが発生しました。