0

私はDjangoを初めて使っていて、何か助けてもらえないかと思っていました。 2つのモデルを参照している2つの外部キーを持つToolCheckOutのテンプレートにフォームを表示しようとしています。私はこのエラーを受け取り続け、解決策を見つける運がなかった。エラー:「Unicodeに強制する:長い文字列が必要です」この行のテンプレートに「{{form.as_p}}」というエラーが表示されます。Djangoの外部キーとフォーム

以前使用していたmysqlデータベースを使用していますこのプロジェクトのために構築されました。

フォーム:

class ToolCheckoutCreateForm(forms.ModelForm): 
    class Meta: 
     model = ToolTransaction 
     fields = [ 
      "ToolID", 
      "Quantity", 
      "PartyID", 
      "CheckOutDate", 
      "CheckInDate", 
     ] 

モデル:

class Tool(models.Model): 
    ToolID=models.CharField(max_length=100, primary_key = True, unique=True, null=False) 
    Quantity=models.IntegerField(null=False) 
    Location=models.CharField(max_length=100, null=False) 
    CategoryID=models.IntegerField(null=True) 
    Deleted=models.BooleanField(default=0) 

    objects=models.Manager() 

    class Meta: 
      managed=True 
      db_table='Tool' 

    def __unicode__(self): 
     return self.ToolID 

    def get_absolute_url(self): 
     return reverse("ToolSearch:toolSearchResults", kwargs={"pk": self.ToolID}) 

class Party(models.Model): 
    PartyID=models.AutoField(primary_key=True) 
    FirstName=models.CharField(max_length=100, null=False) 
    LastName=models.CharField(max_length=100, null=False) 
    PhoneNumber=models.CharField(max_length=25, null=False) 
    Organization=models.CharField(max_length=100, null=True) 
    Deleted=models.BooleanField(default=0) 

    objects=models.Manager() 

    class Meta: 
     managed=True 
     db_table='Party' 

    def __unicode__(self): 
     return self.PartyID 

    def get_absolute_url(self): 
     return reverse("ToolSearch:borrowerUpdate", kwargs={"pk": self.PartyID}) 


class ToolTransaction(models.Model): 
    CheckOutID=models.AutoField(primary_key=True) 
    ToolID=models.ForeignKey(Tool, on_delete=models.CASCADE) 
    PartyID=models.ForeignKey(Party, on_delete=models.CASCADE) 
    Quantity=models.IntegerField(null=False) 
    CheckOutDate=models.DateField(null=False) 
    CheckInDate=models.DateField(null=True) 
    Deleted=models.BooleanField(default=0) 

    objects=models.Manager() 

    class Meta: 
     managed=True 
     db_table='ToolTransaction' 
     ordering=('CheckOutID',) 

    def __unicode__(self): 
     return str(self.CheckOutID) or u'' 

    def get_absolute_url(self): 
     return reverse("ToolSearch:toolCheckout", kwargs={"pk": self.CheckOutID}) 

テンプレート:

<form method = 'POST' action=''> 
     {% csrf_token %} 
     {{form.as_p}} 
     <input type = 'submit' class = "button" value = 'Save'/> 

任意の助けをいただければ幸いです!

+0

完全なトレースバックを表示してください。 –

答えて

1

__unicode__()は、常に文字列またはユニコードを返す必要があります。 Party.__unicode__()はありません。修正するには、戻り値を文字列に明示的に変換します。return str(self.PartyID)

+0

ありがとうございました。私はPartyモデルのリターンを文字列に更新して、すべてが今働いています。あなたは私のヒーローです! – furiousGeorge

0

このようなメソッドを追加します。

def __unicode__(self): 
    return u"%i" % self.CheckOutID 

ドキュメントは言う:あなたは、オブジェクトに対してunicode()を呼び出したときに

ユニコード()メソッドが呼び出されます。 Djangoのデータベースバックエンドは、あなたのモデルの属性にUnicode文字列を返すので、普通はあなたのモデルにユニコード()メソッドを書いておきます。

+0

ToolTransatctionモデルには既に '__unicode__'メソッドがあり、self.CheckOutIDをstringに変換して返します。 – skoll