2012-02-25 4 views
1

В настоящее время я работаю над своим первым приложением Django, которое позволяет зарегистрированным пользователям отправлять контент через базовую форму.Сохранение пользователя 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)) 

EDIT: Я думаю, что я нашел относительно простой ответ: Я просто удалил поле «автор» из формы и сохранил вид тот же. Таким образом, я смог опубликовать имя зарегистрированного пользователя. Я думаю, что это работает, если что-то, о чем я не знаю (что много), является неправильным или плохим протоколом.

ответ

2

мне удалось сделать что-то подобное:

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

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

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

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

+0

Интересное решение. У вас была такая же проблема с выпадающим меню, разоблачающим всех пользователей?И это закончилось? Кроме того, это ваше редактирование с сохранением необходимой формы или просто более подходящей для работы с формами, созданными непосредственно из моделей? –

+0

Вы получаете меню выбора выпадающего списка, так как это виджет по умолчанию для поля * ForeignKey *, и да, я тоже это сделал. Я не хотел помещать имя пользователя в формы, так как пользователю ясно, как его зовут, и поэтому мой код удаляет его из формы (для отображения). Нет, это необязательно, но больше объектно ориентировано делать это в самом объекте формы. –

+0

Отлично. И используя ваш метод, он автоматически заполнил поле пользователя зарегистрированным именем пользователя? Если это так, это будет близко к совершенству. –

Смежные вопросы