복붙노트

[PYTHON] Django ModelForm과 함께 request.user 사용하기

PYTHON

Django ModelForm과 함께 request.user 사용하기

로그인 한 사용자와 Django ModelForm에 문제가 있습니다. 저는 _Animal_이라는 클래스를 가지고 있는데,이 클래스에는 사용자에 대한 ForeignKey와 나이, 인종 등과 같은 동물 관련 데이터가 있습니다.

사용자는 db에 Animals를 추가 할 수 있으며 각 동물의 작성자를 추적해야하므로 사용자가 동물 인스턴스를 만들 때 기록되는 request.user를 추가해야합니다.

models.py

class Animal(models.Model):
    name = models.CharField(max_length=300)
    age = models.PositiveSmallIntegerField()
    race = models.ForeignKey(Race)
    ...
    publisher = models.ForeignKey(User)
    def __unicode__(self):
        return self.name

class AnimalForm(ModelForm):
    class Meta:
        model = Animal

주요 목표는 양식의 게시자 필드를 숨기고 저장 버튼을 누를 때 기록 된 사용자를 제출하는 것입니다.

초기 사용자를 사용하여보기에서 현재 사용자를 잡을 수 있지만 필자가 원하는 것은 필드를 표시하지 않습니다.

views.py

@login_required
def new_animal(request):
    if request.method == "POST":
        form = AnimalForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('/')
        else:
            variables = RequestContext(request, {'form': form})
            return render_to_response('web/animal_form.html', variables)
    else:
        form = AnimalForm(initial={'publisher': request.user})
    variables = RequestContext(request, {'form': form})
    return render_to_response('web/animal_form.html', variables)

해결법

  1. ==============================

    1.양식에서 양식을 제외하고보기에 설정하면됩니다.

    양식에서 양식을 제외하고보기에 설정하면됩니다.

    class AnimalForm(ModelForm):
        class Meta:
            model = Animal
            exclude = ('publisher',)
    

    ... 그리고보기 :

        form = AnimalForm(request.POST)
        if form.is_valid():
            animal = form.save(commit=False)
            animal.publisher = request.user
            animal.save()
    

    (첫 번째 else 절 (redirect 바로 다음에 나오는 줄은 불필요합니다.)을 생략하면 실행이 끝나면 두 줄로 동일하게됩니다.

  2. ==============================

    2.다른 방법 (약간 더 짧음) : 필드도 제외해야합니다.

    다른 방법 (약간 더 짧음) : 필드도 제외해야합니다.

    class AnimalForm(ModelForm):
        class Meta:
            model = Animal
            exclude = ('publisher',)
    

    다음 뷰에서 :

    animal = Animal(publisher=request.user)  
    form = AnimalForm(request.POST, instance=animal)
    if form.is_valid():
         animal.save()
    
  3. ==============================

    3.나는 그것을 폼에 직접 추가 할 것이다 :

    나는 그것을 폼에 직접 추가 할 것이다 :

    class AnimalForm(ModelForm):
        class Meta:
            model = Animal
            exclude = ('publisher',)
    
        def save(self, commit=True):
            self.instance.publisher = self.request.user
            return super().save(commit=commit)
    

    이것은 제 의견으로는 가장 깨끗한 버전이며 다른보기에서 양식을 사용할 수 있습니다.

  4. from https://stackoverflow.com/questions/8466768/using-request-user-with-django-modelform by cc-by-sa and MIT license