Джанго: Если пользователь уже вводил адрес - PullRequest
2 голосов
/ 18 мая 2011

Я хочу представить пользователю форму, если он не заполнил ее ранее при входе в систему, но перенаправить его на домашнюю страницу, если он заполнил информацию ранее.Как мне это сделать?

Вот мой взгляд:

def makinginfo(request):
    form = SongForm(request.POST or None)
    songprofile =  SongProfile.objects.get().filter(user=request.user)
    if songprofile = null: IS THIS RIGHT?     
        if form.is_valid():
            form.save()
            sp = SongProfile
            sp.song = form.pk
            sp.save()
            if 'next' in request.POST:
               next = request.POST['next']
            else:
               next = reverse('index_show')
               return HttpResponseRedirect(next)
        return render_to_response(
        'song/create.html',
           {'form':form},

             context_instance = RequestContext(request)
               )

     else:
        return render_to_response(
        'song/show.html',
         context_instance = RequestContext(request)
               )

Я на правильном пути?

Спасибо,

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ:

SongProfile и Song - две разные модели.Модель SongProfile выглядит следующим образом: class SongProfile(models.Model): song = models.OneToOneField(Song), поэтому, когда я пытаюсь сохранить как в song, так и в songprofile, где songprofile.song сохраняет последний id / pk записи, созданной в композиции.это неправильно?

Ответы [ 2 ]

5 голосов
/ 18 мая 2011

Я предполагаю, что существует только один объект SongProfile на пользователя.

 try:
    songprofile = SongProfile.objects.get(user=request.user)
    # Render song/show.html
 except SongProfile.DoesNotExist:
   if form.is_valid():
      # Process post

   # Render song/create.html

Чтобы создать новый объект SongProfile с композицией, созданной по форме:

 song = form.save()
 songprofile = SongProfile(user=request.user)
 songprofile.song = song
 songprofile.save()

ИЗМЕНИТЬ СНОВА :

Исправлены вещи в обратном направлении и добавлен объект Song.

2 голосов
/ 22 мая 2011

Вы действительно можете сделать try/catch, как продемонстрировал Тим, и это сработает.Если вы обнаружите, что в некоторых случаях вы начинаете фильтровать больше полей или что вы хотите разумного значения по умолчанию, вы можете сделать так, как предлагают документы, и использовать метод get_or_create(), например:

sp, created = SongProfile.objects.get_or_create(user=request.user)

Из документов :

Все аргументы ключевого слова, переданные get_or_create () - кроме необязательного, называемого defaults - будут использоваться в вызове get ().Если объект найден, get_or_create () возвращает кортеж этого объекта и False.Если объект не найден, get_or_create () будет создавать экземпляр и сохранять новый объект, возвращая кортеж нового объекта и значение True.

Таким образом, логическое значение указывает, нужно ли создавать объект илинет, и вы можете использовать его для управления логикой метода.

Этот синтаксис также немного короче и чище.

Что касается попыток сохранить как Song, так и SongProfile,нет, ты не ошибаешьсяКак продемонстрировал Тим, form.save() создает новые song и songprofile.song = song, за которыми следует songprofile.save(), сохраняет ссылку на песню songprofile.

В паре есть несколько небольших ошибок.пример кодаОдна ошибка,

if songprofile = null:
    ...

, которая, как вы заметили в @Natim, должна была использоваться,

if songprofile is None:
    ...

Другая проблема в строке,

sp = SongProfile

который Python действительно будет компилировать, но который назначает ссылку на объект класса SongProfile на переменную, а не на экземпляр самого класса.То, что вы хотите сделать обычно, будет

sp2 = SongProfile()

, и это создаст экземпляр объекта.Если вы сделаете dir(sp) и dir(sp2), вы увидите разницу.

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