2016-07-26 19 views
3

親モデルに関連するForeignKeyインスタンス「parent」を持つ子モデルを作成しました。私はポストに子供を関連づけたかった。このため、私のフォームでは、「親」フィールドのためにModelChoiceFieldを作成しました。だから私のテンプレートでこれを描画するには、私は私の下のコードとして何かを作る。私がコードを実行すると、エラーが発生します:Python/Django:TypeError:__str__が非文字列(型UUID)を返しました

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

私はこのエラーを修正するのを手伝っていただきありがとうございます。ここで

は私のコードです:

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"] 

テンプレート:

<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> 

アップデート-1:

views.py:

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

あなたは[ '親'] self.fields '使用する必要があるクエリセット= Parent.objects.all()' 'あなたのChildForm'インチ。 '()'に注意してください。 –

+0

ありがとうございます。私はかっこを見逃した。今、私はエラーが発生しています:私はUUIDを主キーとして使用したので、__str__は非文字列(型UUID)を返しました。なぜ私はこれを得ているのか分かりますか? – sumanth

+2

str(uuidフィールド)として使用します。 –

答えて

4

これはあなたを助けることがありますが、フロントエンドから受け入れて、主キーに基づいて、あなたの主キーフィールドのテーブルで何かを書きたい場合は次のコード

使用。

import uuid 
uuidField = uuid.UUID(uuidField) 

そして、あなたはそれ以外の場合はシリアライズ得ることはありませんSTR(uuidField)として使用することをフロントエンドにデータベースに要求し、その出力を送信する場合。あなたにエラーを与えます。

次のように変更し、それを:

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

どこで使うべきですか?私の親モデルの新しいフィールドとして? – sumanth

+0

まだ同じエラーが発生しています。実際にuuidField = uuid.UUID(uuidField)には何の役割がありますか?私はコードのどこかにそれを含めるべきですか? – sumanth

+0

これは、uuidフィールドのテーブルにFrontEndとしてstrとして送信する行を追加する必要があるときに、比較目的のためにuuidで変更する必要がある場合です。 –

関連する問題