2016-07-26 16 views
3

Ich erstellte ein Child-Modell mit einer ForeignKey Instanz 'parent' im Zusammenhang mit dem Parent-Modell. Ich wollte Post ein Kind zuordnen. Hierzu habe ich in meinen Formularen ein ModelChoiceField für das Feld 'Eltern' erstellt. Um dies in meiner Vorlage darzustellen, mache ich etwas wie meinen untenstehenden Code. Wenn ich den Code ausgeführt wird, erhöht er einen Fehler:Python/Django: TypeError: __str__ gab nicht-string zurück (UUID-Typ)

TypeError : str returned non-string (type UUID).

Ich würde schätzen, mir diesen Fehler in Verlegenheit zu helfen.

Hier ist mein Code:

Models.py:

class Parent(models.Model): 

    parent_id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) 
    user = models.ForeignKey(settings.AUTH_USER_MODEL, default=1) 
    from1 = models.CharField(max_length=20) 
    timestamp = models.DateTimeField(auto_now=False, auto_now_add=True) 

    objects = ParentManager() 

    def __str__(self): 
     return self.parent_id 

    def get_absolute_url(self): 
     return reverse("detail", kwargs={"id": self.parent_id}) 


class Child(models.Model): 

    child_id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) 
    parent = models.ForeignKey(Parent, default=uuid.uuid4, related_name='childs') 
    user = models.OneToOneField(settings.AUTH_USER_MODEL, null=True, blank=True, unique=False) 
    amount = models.IntegerField() 

    def get_absolute_url(self): 
     return reverse("accept_child", kwargs={"child_id": self.child_id}) 

    def __unicode__(self): 
     return self.amount 

    def __str__(self): 
     return self.amount 

forms.py:

class ChildForm(forms.ModelForm): 

    parent = forms.ModelChoiceField(queryset= Parent.objects.all(), label="Parent", widget=forms.RadioSelect(), initial=0) 
    amount = forms.IntegerField(help_text='Place the child for a Parent') 

    def __init__(self, *args, **kwargs): 
     self.request = kwargs.pop('request', None) 
     super(ChildForm, self).__init__(*args, **kwargs) 
     self.fields['parent'].queryset = Parent.objects.all() 

    class Meta: 
     model = Child 
     fields = ["amount"] 

Vorlage:

<td > {% for choice in form.parent.field.choices %} 
<li><input type="radio" name="{{ choice.parent }}" value="{{ choice.0 }}" /> 
<label for="">{{choice.1}}</label></li> 
{% endfor %}</td> 

-Update-1:

views.py:

Verwenden folgenden Code, wenn Sie etwas in Ihrem Primärschlüsselfeld Tabelle auf der Grundlage der Primärschlüssel Annahme von Front-End schreiben wollen:

def live_bid_truck(request): 

form = ChildForm(request.POST or None) 

if form.is_valid(): 
    child = form.save(commit=False) 

    print(form.cleaned_data.get("amount")) 
    child.user = request.user # YOU SET THE USER 
    child.parent = ?? # I DON'T HOW TO SET THE PARENT HERE, 


    child.save() 


    print(child.parent.id) 
+1

Sie müssen 'self.fields [ 'Eltern'] verwenden queryset = Parent.objects.all()' im 'ChildForm'.. Beachte das '()'. –

+0

Danke. Ich habe Klammern vergessen. Jetzt bekomme ich einen Fehler: __str__ gab nicht-string (Typ UUID) zurück, da ich UUID als Primärschlüssel verwendete. Darf ich wissen, warum ich das bekomme? – sumanth

+2

Verwenden Sie es als Str (Uuid-Feld). –

Antwort

4

Dies kann Ihnen helfen.

import uuid 
uuidField = uuid.UUID(uuidField) 

Und wenn Sie möchten, Datenbank anzufordern und diese Ausgabe senden, um die Verwendung als str (uuidField) Frontends sonst wird es nicht bekommen serialisiert. und wird dir einen Fehler geben.

ändern sie wie folgt:

def __str__(self): 
    return str(self.parent_id) 
+0

Wo soll ich das verwenden? Als neues Feld in meinem Elternmodell? – sumanth

+0

Immer noch bekomme ich den gleichen Fehler. Was eigentlich UuidField = Uuid.UUID (UuidField) spielt hier eine Rolle? Sollte ich es irgendwo in meinem Code einschließen? – sumanth

+0

Das ist was, wenn Sie einige Zeilen in der UUID-Feldtabelle als FrontEnd hinzufügen müssen, senden Sie es als str, also müssen Sie es zu Vergleichszwecken in uuid ändern. –