이의 우리가 옷장라는 응용 프로그램을하고 일부 모델이 있다고 가정 해 봅시다 쿼리 문자열로 지정 사전 인구 및 편집 할 필드 CreateView : 일반 상세보기를 사용장고 :
# closet.models.py
class Outfit(models.Model):
shirt = models.ForeignKey(Shirt)
pants = models.ForeignKey(Trouser)
class Shirt(models.Model):
desc = models.TextField()
class Trouser(models.Model):
desc = models.TextField()
class Footwear(models.Model):
desc = models.TextField
을,이 URL의 conf를 쉽게 만들 수 그 각각에 대한 자세한 내용은 : 나는 다음에 무엇을하고 싶은 무엇
#urls.py
urlpatterns = patterns('',
url(r'^closet/outfit/(?P<pk>\d+)$', DetailView(model=Outfit), name='outfit_detail'),
url(r'^closet/shirt/(?P<pk>\d+)$', DetailView(model=Shirt), name='shirt_detail'),
url(r'^closet/trouser/(?P<pk>\d+)$', DetailView(model=Trouser), name='trouser_detail'),
url(r'^closet/footwear/(?P<pk>\d+)$', DetailView(model=Footwear), name='footwear_detail'),
)
각 유형의 새로운 객체를 생성 할 뷰를 정의합니다. 미리 채워진 필드에 대한 데이터를 처리 할 수있는 CreateView
의 확장 버전으로이 작업을 수행하고 싶습니다. 내가 /closet/outfit/new
를 방문하면 내가 다 함께 Outfit
모델에 대한 표준 ModelForm
을 얻고 싶은
- 빈과 모든 편집 :
는 특히, 나는 다음과 같은 동작을합니다.
- 내가
/closet/outfit/new/?shirt=1
을 방문하면 1)에서 본 모든 필드를보고 싶지만, 셔츠 필드에 pk = 1 인 셔츠가 미리 채워지 길 원합니다. 또한 셔츠 필드를 편집 할 수없는 것으로 표시하려고합니다. 양식이 제출되고 유효하지 않은 것으로 간주되는 경우 양식이 다시 표시 될 때 나는 셔츠 필드를 계속 편집 불가능하게하고 싶습니다. - 내가
/closet/outfit/new/?shirt=1&trouser=2
을 방문하면 나는 1)에서 본 모든 분야를보고 싶지만 이제는 셔츠와 바지 밭 모두를 사전 검토하고 편집 할 수 있어야합니다. (즉,footwear
필드 만 편집 가능해야합니다.)
일반적으로 가능합니까? 나는. 쿼리 링은 이러한 방식으로 표시된 폼의 구조를 수정할 수 있습니까? DRYest 가능한 방식으로이 작업을 수행하고 싶습니다. 내 직감이 수업 기반의 견해와 함께 할 수 있어야하고 어쩌면 model_form_factory
을 포함하지만 내 마음에 똑바로 논리를 얻을 수 없다고 말해. 특히, ModelForm
이 생성 될 때 클래스 기반보기에 request.REQUEST
(즉, request.POST
또는 request.GET
매개 변수)에 액세스 할 수 있는지 여부가 확실하지 않았습니다.
아마도 잠긴 필드에 대해 다른 쿼리 문자열 키워드를 사용하는 경우에만 가능합니다. 나는. 아마도 URL은 /closet/outfit/new/?lock_shirt=1
및 /closet/outfit/new?lock_shirt=1&lock_trouser=2
일 필요가 있습니다. 아마 그 방법을 완료하면 POST
핸들러는 객체를 실제로 생성 할 목적으로 모든 모델 필드의 일반 목록과 함께 잠긴 필드 목록 (브라우저에 양식 표시를 위해)을 건네 줄 것입니다.
왜이 원하는 수행하십시오 footwear_detail
의 템플릿에서 나는 일반적으로
<a href="{% url outfit_new %}?footwear={{object.pk}}>Click to create a new outfit with this footwear!</a>
같은 태그를 만들 수 있도록하려는 것, 정말 유용 할 것이다 형태에 대한 링크를 만들 수 있도록 전달 된 쿼리 문자열에 따라 "구조"(값만이 아님)가 변경됩니다.
Berislav LoPAC 제품군에서 큰 제안에 응답 :
그래서 내가 나서서했다 :class CreateViewWithPredefined(CreateView):
def get_initial(self):
return self.request.GET
이 나에게 내가 필요의 90 %를 가져옵니다. 그러나 상황을 조금 더 살피겠습니다.Outfit 모델에 두 필드를 추가한다고 가정 해 보겠습니다. headgear = models.ManyToManyField('headgear')
및 awesomeness_rating = models.FloatField()
.
두 가지 문제 :
- 내가
/closet/outfit/new/?awesomeness_rating=10
을 방문하는 경우 다음 내 양식이[u'10']
대신 단지10
로 채우기로 미리 채워집니다. 내 서식 파일에 사용해야하는 필터가 있습니까? 아니면 서식을보다 적절하게 만들기 위해 내보기에 추가 할 수있는 약간의 처리가 있습니까? - 머리 장식을 미리 지정하려는 경우 쿼리 문자열을 통해 파이썬 목록과 같은 느낌을 전달하는 올바른 형식은 무엇입니까? 나는.
/closet/outfit/new/?headgear=1,2,3
을해야합니까? 그렇다면 Django는 ID로 3 가지 헤드 기어를 미리 선택하고 싶습니다. 계속이 작업을 할 수
은 ...
class CreateViewWithPredefined(CreateView):
def get_initial(self):
initial = super(CreateView, self).get_initial()
for k, v in self.request.GET.iterlists():
if len(v) > 1:
initial.update({ k : v })
else:
initial.update({ k : v[0] })
return initial
이 하나의 돌로 두 새를 죽일 것 : 숫자 데이터는 숫자에 유니 코드에서 강제됩니다 그리고 목록을 평평 가능한 경우 (같은 예정된). 이것이 다중 값 필드에서 작동하는지 확인해야합니다.
위대한 첫 번째 단계입니다. 이 방법을 구현하는 방법에 대해 두 가지 질문이 있습니다. 위의 원래 게시물의 수정 사항을 참조하십시오. 나는 나의 목적을 위해 생각한다, 나는 그것이이 요지를 얻었 기 때문에이 길로 가기를 포기할 것이다. 그러나 다른 사람들이 원래의 문제에 관심을 갖는 정도까지 : 원래의 질문에 대한 해결책을 가진 사람이 있습니까? 폼에 초기 데이터를 미리 채우는 대신 미리 채워진 필드를 실제로 표시하는 방법이 있습니다. 잠겨있어? – 8one6
한 가지 방법은 입력 요소에'readonly' 속성을 추가하는 것입니다. 아마도 뷰의'get_form' 메소드에 있습니다. 'request.GET' 필드를 사용하거나 (코드 중복을 피하기 위해'get_initial'을 더 잘 사용하십시오) 거기에 값이있는 각 필드의 위젯을 수정할 수 있습니다. 고마워요. –
. 나는 이것에 아주 새롭고 여전히 유니 코드 포맷에 문제가있다. 나는'request.GET'에서 얻은 QueryDict의 모든 엔트리가 유니 코드 문자열로 포맷된다는 것을 이해합니다. 유니 코드를 기본 파이썬 데이터 유형으로 변환하는 일반적인 방법이 있습니까? 그래서// closet/outfit/new /? awesomeness_level = 10'을 입력하면 필드가 [u'10] 대신에 10으로 미리 채워지는 것을 확인하고 싶습니다 ... – 8one6