5

이의 우리가 옷장라는 응용 프로그램을하고 일부 모델이 있다고 가정 해 봅시다 쿼리 문자열로 지정 사전 인구 및 편집 할 필드 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을 얻고 싶은

  1. 빈과 모든 편집 :

    는 특히, 나는 다음과 같은 동작을합니다.

  2. 내가 /closet/outfit/new/?shirt=1을 방문하면 1)에서 본 모든 필드를보고 싶지만, 셔츠 필드에 pk = 1 인 셔츠가 미리 채워지 길 원합니다. 또한 셔츠 필드를 편집 할 수없는 것으로 표시하려고합니다. 양식이 제출되고 유효하지 않은 것으로 간주되는 경우 양식이 다시 표시 될 때 나는 셔츠 필드를 계속 편집 불가능하게하고 싶습니다.
  3. 내가 /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().

두 가지 문제 :

  1. 내가 /closet/outfit/new/?awesomeness_rating=10을 방문하는 경우

    다음 내 양식이 [u'10'] 대신 단지 10로 채우기로 미리 채워집니다. 내 서식 파일에 사용해야하는 필터가 있습니까? 아니면 서식을보다 적절하게 만들기 위해 내보기에 추가 할 수있는 약간의 처리가 있습니까?
  2. 머리 장식을 미리 지정하려는 경우 쿼리 문자열을 통해 파이썬 목록과 같은 느낌을 전달하는 올바른 형식은 무엇입니까? 나는. /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 

이 하나의 돌로 두 새를 죽일 것 : 숫자 데이터는 숫자에 유니 코드에서 강제됩니다 그리고 목록을 평평 가능한 경우 (같은 예정된). 이것이 다중 값 필드에서 작동하는지 확인해야합니다.

답변

4

CBV의 어느 곳에서나 self.request입니다. :-)

좋아,이 대답을 좀 더 포괄적으로 만들어 보겠습니다. 기본적으로 원하는 것은 FormMixin에 의해 제공되는 get_initial 메서드입니다. 필드의 값을 채우려면 필드를 재정의하십시오.

+0

위대한 첫 번째 단계입니다. 이 방법을 구현하는 방법에 대해 두 가지 질문이 있습니다. 위의 원래 게시물의 수정 사항을 참조하십시오. 나는 나의 목적을 위해 생각한다, 나는 그것이이 요지를 얻었 기 때문에이 길로 가기를 포기할 것이다. 그러나 다른 사람들이 원래의 문제에 관심을 갖는 정도까지 : 원래의 질문에 대한 해결책을 가진 사람이 있습니까? 폼에 초기 데이터를 미리 채우는 대신 미리 채워진 필드를 실제로 표시하는 방법이 있습니다. 잠겨있어? – 8one6

+0

한 가지 방법은 입력 요소에'readonly' 속성을 추가하는 것입니다. 아마도 뷰의'get_form' 메소드에 있습니다. 'request.GET' 필드를 사용하거나 (코드 중복을 피하기 위해'get_initial'을 더 잘 사용하십시오) 거기에 값이있는 각 필드의 위젯을 수정할 수 있습니다. 고마워요. –

+0

. 나는 이것에 아주 새롭고 여전히 유니 코드 포맷에 문제가있다. 나는'request.GET'에서 얻은 QueryDict의 모든 엔트리가 유니 코드 문자열로 포맷된다는 것을 이해합니다. 유니 코드를 기본 파이썬 데이터 유형으로 변환하는 일반적인 방법이 있습니까? 그래서// closet/outfit/new /? awesomeness_level = 10'을 입력하면 필드가 [u'10] 대신에 10으로 미리 채워지는 것을 확인하고 싶습니다 ... – 8one6