기본 클래스 인 Animal에서 상속받은 일부 모델이 있다고 가정 해 봅시다. 일반 뷰를 사용하고 Cat/12를 세부 뷰에, Dod/10을 다른 세부 컨텍스트와 동일한 세부 뷰에 라우팅 할 수 있습니다. 하지만 경로를 정의 할 필요가 없도록 URL에서 모델 이름을 얻고 싶습니다.Django - 일반 뷰에 대한 매개 변수로 모델 이름을 전달하십시오.
url(r'^cat/(?P<slug>[-\w]+)/$',
DetailView.as_view(
queryset=Cat.objects.filter(),
model=Cat,
context_object_name='animal',
template_name='animal/detail.html'),
name='detail'),
url(r'^dog/(?P<slug>[-\w]+)/$',
DetailView.as_view(
queryset=Dog.objects.filter(),
model=Dog,
context_object_name='animal',
template_name='animal/detail.html'),
name='detail'),
...
분명히, 이것은 너무 많은 반복적 인 코드 :
나는 이런 식으로 뭔가가있다. 차라리 이렇게 할 것입니다 :
url(r'^?P<my_animal>\w+/(?P<slug>[-\w]+)/$',
DetailView.as_view(
queryset=my_animal.objects.filter(),
model=my_animal,
context_object_name='animal',
template_name='animal/detail.html'),
name='detail'),
...
이 작업을 수행 할 수 있습니까?
편집
여기, 내가 함께 결국 무엇 다윈의 도움 덕분입니다. 모델명을 얻기 위해 if/else를 피할 수 있습니다 :
class AnimalDetailView(DetailView):
context_object_name='animal'
template_name='animals/detail.html'
def dispatch(self, request, *args, **kwargs):
my_animal = kwargs.get('my_animal', None)
self.model = get_model('animals',my_animal.capitalize())
try:
ret = super(AnimalDetailView, self).dispatch(request, *args, **kwargs)
except AttributeError:
raise Http404
return ret
def get_queryset(self):
return self.model.objects.filter()
다음에 나는 상속에 대해 질문 할 것이고, 나는 다윈과상의 할 것입니다! LOL
도움이되지 않는 오류 종류 :'이 메서드는 뷰 클래스에서만 사용할 수 있습니다. . –
코드를 다시보십시오. 처리기는 그 안에 있지 않고 AnimalDetailView 다음에 정의됩니다. – Darwin
AnimalDetailView 클래스 외부에서 정의했습니다. 내 views.py에서'animals.views 가져 오기 처리기 '를 사용하여 가져 오기 –