Сохранение пользователя Django в форме - PullRequest
1 голос
/ 25 февраля 2012

В настоящее время я работаю над своим первым приложением Django, которое позволяет зарегистрированным пользователям отправлять контент через базовую форму.

Пока что оно работает с одним предупреждением: когда форма отображается, пользователь ("Автор ") представлен раскрывающимся списком всех пользователей вместо того, чтобы автоматически заполнять это поле именем пользователя.Это, очевидно, недопустимо.

Цель состоит в том, чтобы имя зарегистрированного пользователя автоматически заполняло форму.Я видел несколько возможных решений подобных проблем, но ничего такого, что касалось бы этого.

Я попытался установить для поля «Автор» в модели значение «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))

РЕДАКТИРОВАТЬ: я думаю, что нашел относительно простой ответ: я только что удалилПоле 'author' из формы и вид не менялись. Я смог разместить под именем зарегистрированного пользователя таким образом. Я думаю, что это работает, если только то, о чем я не знаю (чего достаточно), является неправильным или плохим протоколом.

1 Ответ

2 голосов
/ 25 февраля 2012

Мне удалось сделать что-то похожее:

Базовый класс для всех моделей, связанных с пользователем:

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)
            ....

Я также немного изменил свой исходный код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...