2016-04-20 10 views
2

私はフォームを作成し、CharFieldとして外部キー 'artist'を設定しました。それが存在しなければ作成されるだろう。アーティストフィールドにデータを入力するとき、私は次のエラーを取得しています:ここでDjango ValueError "testing"を割り当てることができません: "Profile.artist"は "アーティスト"インスタンスでなければなりません

ValueError: Cannot assign "'testing'": "Profile.artist" must be a "Artist" instance

は私のmodels.pyである:ここでは

class Artist (models.Model): 
    name = models.CharField(max_length=100) 

    def __str__(self): 
     return self.name 

class Genre (models.Model): 
    name = models.CharField(max_length=100) 
    def __str__(self): 
     return self.name 

class Profile (models.Model):  
    artist = models.ForeignKey(Artist, on_delete=models.CASCADE) 
    genre = models.ForeignKey(Genre, on_delete=models.CASCADE) 
    title = models.CharField(max_length=100) 
    mix = models.CharField(max_length=100, blank=True) 

    def __str__(self): 
     return self.title 

は私のviews.pyです:

ここ
def profile_create(request): 
    if request.method == 'POST': 
     form = ProfileForm(request.POST) 
     if form.is_valid(): 
      instance = form.save(commit=False) 
      instance.user = request.user 
      instance.save()   
      form = ProfileForm(None) #clears the form for new submission 
      context = { 
       "form": form, 
       "instance": instance, 
      } 
      return render(request, "profile_form.html", context) 
    else: 
     form = ProfileForm(None) 
     context = { 
      "form": form, 
     } 
     return render(request, "profile_form.html", context) 

私のforms.py:

from django import forms 
from .models import Profile, Artist 

class ProfileForm(forms.ModelForm): 

    class Meta: 
     model = Profile 
     fields = [ 
      "artist", 
      "title", 
      "mix", 
      "genre", 
      ] 

    artist = forms.CharField(widget=forms.TextInput) 

    def clean_artist(self, commit=True): 
     artist = self.cleaned_data.get("artist") 
     if not artist: 
      raise forms.ValidationError("Artist is a required field.") 
     else: 
      artist, created = Artist.objects.get_or_create(name=artist) 
      self.cleaned_data['artist'] = artist 
      return super(ProfileForm, self).clean() 
+1

あなたは 'clean_artist'メソッドの中でsuper' clean() 'を呼び出すべきではありません。また、そのメソッドは 'commit'パラメータを取ることもありません。 –

+0

'commit = True'パラメータは必要ありません – Sayse

答えて

1

clean_artistメソッドは、アーティストフィールドのクリーンアップされた値を返す必要があります。その代わりに

artist, created = Artist.objects.get_or_create(name=artist) 
self.cleaned_data['artist'] = artist 
return super(ProfileForm, self).clean() 

の私はにエラーがある場合、それは問題を提起する可能性があるので、クリーンな方法でフィールドの種類を書き換えることがベストプラクティスである場合けれどもわからない

artist, created = Artist.objects.get_or_create(name=artist) 
return artist 

を行いますそのフォームとそれを値としてのアーティストインスタンスで再度レンダリングする必要があります。

私はおそらくMeta.fieldsからartistフィールドを削除し、Artist.objects.get_or_create(name=artist)を行うと、フォームのsave方法では、インスタンスのアーティストフィールドを設定します。

+0

ありがとう、それは動作しますが、' Meta.fields'から 'artist'フィールドを削除すると、フォームはフォームの上部ではなく、 。フォームを提出すると、私は** profiles_profile.artist_idがNULLにならないことがあります** – bayman

+0

フィールドの順序は、Form.field_order(https://docs.djangoproject.com/ja/1.9/ref/forms)を使って定義できます/api/#django.forms.Form.field_order)からdjango 1.9をダウンロードしてください。 – Tim

+0

フォームにアーティストを手動で設定する 'save()'メソッドをフォームに追加する必要があります。 – Tim

関連する問題