WebHU - Programozási kérdések és válaszok

Django űrlap (jelölőnégyzet) - nem menthető az adatok

Megpróbálok megjeleníteni egy űrlapot (többszörös jelölőnégyzettel), és az adatokat adatbázisba menteni. De van valami probléma.

Íme a modellem:

class Preference(models.Model):

    CLASS_CHOICES = [('1', '1'), ('2', '2'), ('3', '3')]
    BOARD_CHOICES = [('C', 'CBSE'), ('I', 'ICSE'), ('S', 'State Board')]
    SUBJECT_CHOICES = [('H', 'HINDI'), ('M', 'MATH'), ('E', 'ENGLISH')]

    class = models.CharField(max_length=2, choices=CLASS_CHOICES, default='1', blank=False)
    board = models.CharField(max_length=2, choices=BOARD_CHOICES, default='C', blank=False)
    subject = models.CharField(max_length=2, choices=SUBJECT_CHOICES, default='M', blank=False)

Az én űrlapom:

class PreferenceForm(forms.ModelForm):
    class Meta:
        model = Preference
        fields = ['class', 'board', 'subject']
        widgets = {
            'board': forms.RadioSelect(),
            'subject': forms.CheckboxSelectMultiple()
        } 

Az én nézetem:

def pref(request):
    form = PreferenceForm(request.POST or None)
    if form.is_valid():
        form.save()
        return render(request, 'website/thanks.html')
    else:
        print(form.errors)
        return render(request, 'website/pref.html', {'form': form})

Megjeleníti az űrlapot jelölőnégyzettel, de nem tudom elmenteni ezeket az adatokat az adatbázisba, még akkor sem, ha egyetlen lehetőséget választok.

Hiba jelenik meg: - `

<li>Subject<ul class="errorlist"><li>Select a valid choice. [&#39;H&#39;, &#39;M&#39;] is not one of the available choices.</li></ul></li>

Minden segítséget/javaslatot szívesen fogadunk, köszönöm.


Válaszok:


1

Először is nevezze át a modellen belüli class mezőt valami másra. A class egy Python által fenntartott szó, és később problémákat okozhat.

Másodszor, egy CharField CheckboxSelectMultiple widgetként való megjelenítéséhez a modell mezők deklarációját meg kell változtatni. Most azt mondja az subject mezőnek, hogy fogadjon el egyetlen értéket (a 'H', 'M' és 'E' értékek közül), de az űrlapon keresztül próbál meg többszörös értékeket adni ([&#39;H&#39;, &#39;M&#39;], ami 'H' és 'M' értéket jelent). Ez a hibád oka. Egy értéket vár el, miközben Ön egynél többet ad neki.

A probléma megoldása az, hogy hozzon létre egy másik modellt, mondjuk Subject, és azon belül deklarálja a SUBJECT_CHOICES és egyetlen mezőt (mondjuk name). Ezután a Preference modelljében módosítsa a subject mezőt ManyToManyField, a CharField helyett. Ily módon a Preference modell subject mezője egynél több értéket tud fogadni.

Valami ilyesmi:

class Subject(models.Model):

    HINDI = 'H'
    MATH = 'M'
    ENGLISH = 'E'

    SUBJECT_CHOICES = [
        (HINDI, 'HINDI'),
        (MATH, 'MATH'),
        (ENGLISH, 'ENGLISH')
    ]

    name = models.CharField(max_length=2, choices=SUBJECT_CHOICES, default=MATH)

    def __str__(self):
        return self.name


class Preference(models.Model):

    CLASS_CHOICES = [('1', '1'), ('2', '2'), ('3', '3')]
    BOARD_CHOICES = [('C', 'CBSE'), ('I', 'ICSE'), ('S', 'State Board')]

    # RENAME THE class FIELD PLEASE, i.e class_number!
    class = models.CharField(max_length=2, choices=CLASS_CHOICES, default='1', blank=False)
    board = models.CharField(max_length=2, choices=BOARD_CHOICES, default='C', blank=False)
    # Notice the plural name of the field. Subjects, not subject, since we're expecting more than one value into this field.
    subjects = models.ManyToManyField(Subject)

Végül:

  1. Ne felejtse el létrehozni a Subject objektumokat (az admin vagy a ./manage shell segítségével). Ha az adminisztrátort használod, akkor ez meglehetősen egyszerű. Ha a shell-et használja, tegye a következőket:

    from myapp.models import Subject
    
    [Subject.objects.create(name=choice[0]) for choice in Subject.SUBJECT_CHOICES]
    
  2. Frissítse a forms.py fájlt az új mezőnévvel: subjects.

30.04.2017
  • Köszönjük válaszát. Az Ön módszerével, amikor a választási lehetőségeket az űrlapon jelenítem meg, csak egyetlen jelölőnégyzetet jelenít meg "Tárgyobjektum" címkével az összes tárgy helyett. 30.04.2017
  • Frissítettem a válaszomat. Először létre kell hozni a Subject objektumokat, és természetesen bele kell tenni egy __str__ metódust, hogy a nevet írja ki a csúnya 'Subject object' helyett. 30.04.2017
  • Már módosította a mező nevét alanyra, és létrehozta a Tárgy objektumokat, de még mindig nem tudja megjeleníteni. Kérem, segítsen nekem a tárgyobjektumok megfelelő létrehozásában. 30.04.2017
  • Még egyszer frissítve. 30.04.2017
  • Örülök, hogy segíthettem. Ha úgy tetszik, a tárgy értékeinek véletlenszerű megkettőzésének elkerülése érdekében (mivel jelenleg egy másik H vagy M értéket is megadhat, így több azonos nevű érték lesz), módosíthatja a name definícióját a következőre: name = models.CharField(max_length=2, unique=True, choices=SUBJECT_CHOICES, default=MATH) . Persze utána futtass migrációt ;) 30.04.2017
  • Új anyagok

    A rádiógomb ellenőrzött eseményének használata a jQueryben
    Ebben a cikkben látni fogjuk, hogyan kell dolgozni a jquery választógombbal ellenőrzött eseményeivel. A választógombok HTML gombok, amelyek segítenek kiválasztani egyetlen értéket egy csoportból...

    Körkörös függőségek megoldása terraformban adatforrásokkal – lépésről lépésre
    Mi az a körkörös függőségek Dolgozzunk egy egyszerű eseten, amikor az SQS-sor és az S3-vödör közötti körkörös függőség problémája van egy egymástól függő címkeérték miatt. provider..

    Miért érdemes elkezdeni a kódolást 2023-ban?
    01100011 01101111 01100100 01100101 — beep boop beep boop Világunk folyamatosan fejlődik a technológia körül, és naponta fejlesztenek új technológiákat a valós problémák megoldására. Amint..

    🎙 Random Noise #2  – Örökbefogadás és hit
    az analitika íratlan világának gondozása Szeretné, hogy ezek a frissítések a postaládájába kerüljenek? Iratkozzon fel itt . "Ha önvezető autókat gyártanak, akkor mi miért ne..

    A legrosszabb politika és prediktív modellek májátültetésre jelöltek számára az Egyesült Államokban
    A máj (vagy óangolul lifer) az emberi test legnehezebb belső szervére utal, amely csendesen működik a nap 24 órájában. Mit csinál a máj? 500 feladatot hajt végre a szervezet egészségének..

    5 webhely, amely 2022-ben fejleszti front-end fejlesztői készségeit
    Frontendmentor.io A tényleges projektek létrehozásával a Frontendmentor.io segítséget nyújt a front-end kódolási képességeinek fejlesztésében. A kódolást azután kezdheti meg, hogy..

    Mikor kell használni a Type-t az interfészhez képest a TypeScriptben?
    A TypeScript a JavaScript gépelt szuperkészlete, amely statikus gépelést ad a nyelvhez. Ez megkönnyíti a robusztus és karbantartható kód írását azáltal, hogy a hibákat a fordítási időben..