Не удается сохранить содержимое формы в базе данных - PullRequest
5 голосов
/ 16 мая 2010

Я пытаюсь сохранить 100 символов формы пользователя в минимальном приложении «микроблог». Мой код, кажется, не имеет никаких загадок, но не работает. Ошибка в views.py, я не могу сохранить внешний ключ в пользовательскую таблицу.

models.py выглядит так:

class NewManager(models.Manager):

    def create_post(self, post, username):
 new = self.model(post=post, created_by=username)
        new.save()
        return new

class New(models.Model):

    post = models.CharField(max_length=120)
    date = models.DateTimeField(auto_now_add=True)
    created_by = models.ForeignKey(User, blank=True) 
    objects = NewManager()   


class NewForm(ModelForm):

    class Meta:
          model = New
          fields = ['post']
         # widgets = {'post': Textarea(attrs={'cols': 80, 'rows': 20})

def save_new(request):

    if request.method == 'POST':
        created_by = User.objects.get(created_by = user) 
        date = request.POST.get('date', '')
        post = request.POST.get('post', '')
        new_obj = New(post=post, date=date, created_by=created_by)
        new_obj.save()
        return HttpResponseRedirect('/')
     else:
           form = NewForm()     
    return render_to_response('news/new_form.html', {'form': form},context_instance=RequestContext(request))  

Я не упомянул здесь импорт - все сделано правильно. Моя ошибка в views.py. Когда я пытаюсь сохранить, он говорит:

локальная переменная «made_by», указанная перед присваиванием

Если в качестве параметра указать created_py, для сохранения требуется больше параметров. Это действительно странно.

1 Ответ

7 голосов
/ 16 мая 2010

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

Впрочем, пара указателей. Во-первых, вы не используете форму для сохранения. Если вы это сделали, вы, вероятно, не увидите эту ошибку. Вместо того, чтобы получать значения вручную из запроса, вам следует создать экземпляр формы, используя request.POST, а затем сохранить его. Кроме того, вы не проверяете, что форма действительно действительна, прежде чем пытаться использовать ее значения. Вот что вы должны делать:

if request.method == 'POST':
    form = NewForm(request.POST)
    if form.is_valid():
        new_obj = form.save(commit=False)
        new_obj.created_by = request.user
        new_obj.save()
        return HttpResponseRedirect('/')
else:
    form = NewForm()
return render_to_response('news/new_form.html', {'form': form},
                          context_instance=RequestContext(request))  

Также обратите внимание, что ваш менеджер совершенно не имеет значения - менеджер по умолчанию уже определяет метод create, который делает то же самое, что и ваш.

...