2012-02-25 11 views
1

私は現在、登録ユーザーが基本フォームを通じてコン​​テンツを送信できるようにする最初のDjangoアプリケーションを開発中です。Djangoユーザーをフォームに保存する

フォームが表示されているときに、そのフィールドにユーザーの名前を自動的に入力するのではなく、すべてのユーザーのドロップダウンリストがユーザーに表示されます(「作成者」)。これは明らかに容認できません。

この目標は、登録ユーザーの名前に自動的にフォームを入力させることです。私は、同様の問題に対する様々な潜在的な解決策をいくつか見てきましたが、このような問題に対処するものはありません。

モデルのAuthorフィールドを "unique = True"に設定しようとしましたが、マイグレーション時にデータベースエラーが発生しました。

任意の洞察力をいただければ幸いです。

モデル:

class Story(models.Model): 
    title = models.CharField(max_length=100) 
    topic = models.CharField(max_length=50) 
    copy = models.TextField() 
    author = models.ForeignKey(User) 
    zip_code = models.CharField(max_length=10) 
    latitude = models.FloatField(blank=False, null=False) 
    longitude = models.FloatField(blank=False, null=False) 
    date = models.DateTimeField(auto_now=True, auto_now_add=True) 
    def __unicode__(self): 
     return " %s" % (self.title) 

をフォーム:

class StoryForm(forms.ModelForm): 
class Meta: 
    model = Story 

ビュー:

@login_required 
def submit_story(request): 
if request.method == "GET": 
    story_form = StoryForm() 
    return render_to_response("report/report.html", 
          {'form': story_form}, 
           context_instance=RequestContext(request)) 
elif request.method =="POST": 
    story_form = StoryForm(request.POST) 
    if story_form.is_valid(): 
     new_story = Story() 
     new_story.title = story_form.cleaned_data["title"] 
     new_story.topic = story_form.cleaned_data["topic"] 
     new_story.copy = story_form.cleaned_data["copy"] 
     new_story.author = request.user 
     new_story.zip_code = story_form.cleaned_data["zip_code"] 
     new_story.latitude = story_form.cleaned_data["latitude"] 
     new_story.longitude = story_form.cleaned_data["longitude"] 
     new_story.save() 
     return HttpResponseRedirect("/report/all/") 
    else: 
     story_form = StoryForm() 
     return render_to_response("report/report.html", 
           {'form': story_form}, 
           context_instance=RequestContext(Request)) 

編集:私は、私は比較的を見つけたと思います簡単な答え:私はフォームから「著者」フィールドを削除して、ビューを同じにしました。この方法で登録ユーザーの名前で投稿することができました。私は、これがうまくいかないか、またはプロトコルが間違っていない限り、これはうまくいくと思います。

class UserOwnedForm(forms.ModelForm): 
    exclude = ["user", ] 

    def __init__(self, user, data=None, *arguments, **keywords): 
     if data: 
      data['user'] = user.id 
      forms.ModelForm.__init__(self, data=data, *arguments, **keywords) 
:ユーザーに関連付けられているすべての形態のため

class UserOwnedModel(models.Model): 
    user = models.ForeignKey(User, editable=True) 

    class Meta: 
     abstract = True 

基本クラス:ユーザーに関連付けられているすべてのモデルの

基本クラス:

答えて

2

は私が似た何かをするために管理しました

私はそれが最善の解決策であるかどうかはわかりません(どんな入力や提案にもうれしいですが)。 これはもちろん、フォームからユーザーフィールドを完全に削除するので、ユーザー名を表示する必要がある場合は、コードを再生する必要があります。これに代えて


EDITまた

、:

new_story = story_form.save() 

EDIT 2

new_story = Story() 
new_story.title = story_form.cleaned_data["title"] 
new_story.topic = story_form.cleaned_data["topic"] 
new_story.copy = story_form.cleaned_data["copy"] 
new_story.author = request.user 
new_story.zip_code = story_form.cleaned_data["zip_code"] 
new_story.latitude = story_form.cleaned_data["latitude"] 
new_story.longitude = story_form.cleaned_data["longitude"] 
new_story.save() 

あなたはこれを行うことができますこのような210

何か:私も私の最初のコードビットを変更

class Story(UserOwnedModel): 
    title = models.CharField(max_length=100) 
    topic = models.CharField(max_length=50) 
    copy = models.TextField() 
    zip_code = models.CharField(max_length=10) 
    latitude = models.FloatField(blank=False, null=False) 
    longitude = models.FloatField(blank=False, null=False) 
    date = models.DateTimeField(auto_now=True, auto_now_add=True) 
    def __unicode__(self): 
     return " %s" % (self.title) 

class StoryForm(UserOwnedForm): 
    class Meta: 
     model = Story 

@login_required 
def submit_story(request): 
    if request.method == "GET": 
     story_form = StoryForm(user=request.user) 
    .... 
    elif request.method =="POST": 
     story_form = StoryForm(data=request.POST, user=request.user) 
     if story_form.is_valid(): 
      new_story = story_form.save() 
      ..... 
     else: 
      story_form = StoryForm(user=request.user) 
      .... 

+0

興味深い解決策。すべてのユーザーを公開するドロップダウンメニューで同じ問題がありましたか?そして、これで終わりましたか?また、モデルから直接作成されたフォームで作業するために、必要なフォームを保存するだけで編集できますか? –

+0

* ForeignKey *フィールドのデフォルトのウィジェットであるため、ドロップダウン選択メニューが表示されます。彼の名前はユーザーにはっきりしているので、フォームにユーザー名を入れたくないので、フォームからフォームを削除します(表示用に)。いいえ、それは必須ではありませんが、フォームオブジェクト自体でそれを行うのはオブジェクト指向です。 –

+0

優れています。そして、あなたのメソッドを使って、自動的にユーザーフィールドに登録ユーザーの名前を入力しましたか?もしそうなら、それは完璧に近いでしょう。 –

関連する問題