[PYTHON] Django ModelForm과 함께 request.user 사용하기
PYTHONDjango 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.양식에서 양식을 제외하고보기에 설정하면됩니다.
양식에서 양식을 제외하고보기에 설정하면됩니다.
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.다른 방법 (약간 더 짧음) : 필드도 제외해야합니다.
다른 방법 (약간 더 짧음) : 필드도 제외해야합니다.
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.나는 그것을 폼에 직접 추가 할 것이다 :
나는 그것을 폼에 직접 추가 할 것이다 :
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)
이것은 제 의견으로는 가장 깨끗한 버전이며 다른보기에서 양식을 사용할 수 있습니다.
from https://stackoverflow.com/questions/8466768/using-request-user-with-django-modelform by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] BeautifulSoup - HTML 조각에있는 모든 링크를 수정합니까? (0) | 2018.11.08 |
---|---|
[PYTHON] 이진 분류 용 TensorFlow (0) | 2018.11.08 |
[PYTHON] 파이썬과 Tcl을 인터페이스하는 창의적인 방법을 알고 계십니까? (0) | 2018.11.08 |
[PYTHON] 파이썬에서 다중 스레드 TCP 서버 (0) | 2018.11.08 |
[PYTHON] Python : 행이 아닌 열로 CSV 작성 (0) | 2018.11.08 |