Мне удалось сделать что-то похожее:
Базовый класс для всех моделей, связанных с пользователем:
class UserOwnedModel(models.Model):
user = models.ForeignKey(User, editable=True)
class Meta:
abstract = True
Базовый класс для всех форм, связанных с пользователем:
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)
Я не уверен, что это лучшее решение (и буду рад любым предложениям или предложениям), но оно работает для меня.
Это, конечно, полностью удаляет поле пользователя из формы, поэтому, если вам нужно отобразить имя пользователя, вам придется поиграть с кодом.
EDIT
Кроме того, вместо этого:
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()
Вы можете сделать это:
new_story = story_form.save()
РЕДАКТИРОВАТЬ 2
Примерно так:
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)
....
Я также немного изменил свой исходный код.