私は現在、登録ユーザーが基本フォームを通じてコンテンツを送信できるようにする最初の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
基本クラス:ユーザーに関連付けられているすべてのモデルの
基本クラス:
興味深い解決策。すべてのユーザーを公開するドロップダウンメニューで同じ問題がありましたか?そして、これで終わりましたか?また、モデルから直接作成されたフォームで作業するために、必要なフォームを保存するだけで編集できますか? –
* ForeignKey *フィールドのデフォルトのウィジェットであるため、ドロップダウン選択メニューが表示されます。彼の名前はユーザーにはっきりしているので、フォームにユーザー名を入れたくないので、フォームからフォームを削除します(表示用に)。いいえ、それは必須ではありませんが、フォームオブジェクト自体でそれを行うのはオブジェクト指向です。 –
優れています。そして、あなたのメソッドを使って、自動的にユーザーフィールドに登録ユーザーの名前を入力しましたか?もしそうなら、それは完璧に近いでしょう。 –