2013-02-18 2 views
6

안녕,장고 관리자 : 업데이트는 인라인 나는 제품을 추가하기위한 양식을 만든

관리자 패널에서 다른 인라인에 따라. 제품과 관련된 일부 모델이 있으므로 양식에 2 개의 인라인 양식 세트가 포함됩니다. 사용자는 제품을 생성 한 다음 다른 속성이있는 해당 제품의 변형을 정의 할 수 있습니다. 나는 이것을 예제로 설명 할 것이다. 사용자는 3 가지 색상의 한 브랜드 티셔츠를 가지고 있으며 다른 가격으로 추가하려고합니다. 티셔츠는 3 가지 변형 된 제품으로 만들어집니다.

class Detail(models.Model): 
    product = models.ForeignKey('Product') 
    attribute = models.ForeignKey('Attribute') 
    value = models.CharField(max_length=500) 

class Attribute(models.Model): 
    name = models.CharField(max_length=300) 

class Variant(models.Model): 
    product = models.ForeignKey(Product) 
    details = models.ManyToManyField(Detail) 
    quantity = models.IntegerField() 
    price = models.DecimalField(max_digits=6, decimal_places=2) 

생략 한 제품은 관계가 없습니다.

class DetailInline(admin.TabularInline): 
    model = Detail 

class VariantInline(admin.StackedInline): 
    model = Variant 

class ProductAdmin(admin.ModelAdmin): 
    class Meta: 
     model = Product 

    inlines = [DetailInline, VariantInline] 

잘 작동하고 모델이 잘 저장되어 있습니다. 변형 인라인에 문제가 있습니다. 변형 인라인은 데이터베이스에 이미 저장된 객체 만 표시합니다. 사용자의 삶을 더 편하게하려면 상세 오브젝트가 생성 될 때 Variant 인라인에 Detail 오브젝트를 추가하는 것이므로 Product가 저장되기 전에 발생해야합니다.

  • 값이있는 인라인을 수동으로 새로 고치는 방법이 있습니까?
  • Detail 개체를 만드는 데 사용할 수있는 중간 저장은 있습니까?하지만 Product가 아닌 결과를 얻으려면 사용할 수 있습니까?
  • 모델을 다시 디자인해야합니까? (필자가하지 않는 한이 작업을 정말로하고 싶지는 않습니다.)
  • 제품을 추가하기 위해 사용자가 따라야 할 다른 워크 플로우가 있습니까?

js를 사용하여 인라인으로 항목을 주입하려고 시도했지만 hackish이고 Django가 잘못된 값을 선택했다는 오류를 던지는 가짜 값으로 formset의 유효성을 검사하지 않았습니다.

이 질문을 쓰는 동안 내 마음에 온 마지막 생각. 인라인 형식의 Object가 변경되면 데이터를 사용자 정의보기로 전달하여 객체를 만들고 결과로 돌아갈 수있는 j를 만들 수 있습니다. 하나의 문제는 내가 옳다고 느끼지 않는 것입니다. 새로운 객체가 생성되었다는 사실을 django에 알려서 기존 값이 아닌 것에 대한 오류를 발생시키지 않게하는 방법입니다.

어쨌든 나는 누군가가이 긴 질문을 이해하기를 바랍니다.

+0

특정 이유에 대해 Variant 대신 Detail to Product를 연결하고 있습니까? –

+0

예. js로 데이터를 필터링하는 데 사용됩니다. –

답변

2

마음에 떠오르는 것은 Knockout.js입니다.

DOM에서 많은 요소를 동시에 업데이트하는 것이 매우 좋으며 클라이언트 측 이벤트에서 Ajax 호출을 사용하여 새로운 값을 사용자 정의보기로 쉽게 푸시 할 수 있습니다.

가이 작업을 수행 할 수있는 몇 가지 프레임 워크가 있지만 나는 녹아웃 읽고 백본, 각도, 엠버 같은 가장 인기있는 것들의 구현하기 용이 한 등

장고는 일반적으로 약 불평이라고 생각 동적으로 추가 된 선택 사항이지만 양식이 유효 할 때 서버 측에 존재하는 한 이론적으로는이 좋을 것입니다.

+0

예, 인라인에서 새 오브젝트에 대해 불평하지 않습니다. 그러나 내 세부 정보가 제품에 대한 참조가 필요하므로 여전히 문제가 있습니다. 나는 가까이 있지만 아직 거기에 없다. –

+0

당신이가는 중이다. – Brandon

0

나는 이미 많은 시간이 걸렸으므로이 아이디어를 포기하기로 결정했으며 아마도 더 많은 것을 취할 것입니다. 또한 내가 생각해 낸 것은 코딩보다는 해킹 해킹이었다. 하지만 여기에 매달려있는 대신에 다른 사람들을위한 힌트를 게시 할 것입니다.

두 모델이 인라인 양식 세트 인 경우 둘 다 기본 모델의 외래 키를 가지고 있고 그 중 하나에는 other 외래 키가 있습니다. 아이디어는 사용자가 입력 한 값에 따라 인라인 중 하나에 가짜 항목을 만드는 것이 었습니다. 표현 된대로 장고와 함께 제공되는 jQuery를 사용하면 꽤 쉽게 수행 할 수 있습니다. 그래서 제가 한 것은 물론 장고는이 모델이 존재하지 않는다는 것을 알았습니다. 해결 방법은 내 양식 및 필드를 만들고 here처럼 clean() 메서드를 재정의하는 것이 었습니다.

많은 문제를 일으켰다. 그 중 일부는 내 모델이 서로 의존했고 db 객체의 존재를 확인하지 않기 위해 clean() 필드 메소드를 약간 잘라야한다는 것이었다. 또한 필드 유효성 검사 단계에서 POST 데이터에 대한 정보가 부족하여 게시 된 데이터가있을 때 clean() 메서드를 재정의해야했습니다. 그러나 부정한 것이므로 POST dict에서 추출하여 유효성을 검사해야했습니다. 이 시점에서 나는 그것이 더 복잡해지면서 일관성없는 데이터로 이어질 수 있으므로 중단하기로 결정했습니다. 그 다음 단계는 ModelAdmin의 Save 메소드를 Override하는 것입니다. 생성 된 객체가 queryset에 없다는 것입니다. formset에 묶여 있지 않습니다.

이 점을 요약하면이 시점에서는 결코 데이터 흐름을 더 잘 제어 할 수있는 내 자신의 change_form보기를 사용하지 않을 것이라고 말합니다.

tl; dr

사용자 지정보기 change_form 만들기.

관련 문제