문제

ReferenceProperty를 사용하여 관련 모델을 얻으려고 노력하고 있지만 큰 행운이 없습니다.3가지 레벨이 있습니다.그룹, 주제, 장점, 단점.그룹에는 많은 주제가 포함되어 있으며 각 주제에는 많은 장단점이 있을 수 있습니다.

새 그룹을 훌륭하게 저장할 수 있지만 이러한 그룹 아래에 주제를 저장하는 방법을 모르겠습니다.각 그룹 아래에 "새 주제" 링크가 있는 페이지에서 간단한 양식(현재 1개 필드)으로 연결하고 싶습니다.분명히 URL에는 그룹 ID 등에 대한 일종의 참조가 있어야 합니다.

내 모델은 다음과 같습니다.

class Groups(db.Model):

    group_user = db.UserProperty()
    group_name = db.StringProperty(multiline=True)
    group_date = db.DateTimeProperty(auto_now_add=True)


class Topics(db.Model):

    topic_user = db.UserProperty()
    topic_name = db.StringProperty(multiline=True)
    topic_date = db.DateTimeProperty(auto_now_add=True)
    topic_group = db.ReferenceProperty(Groups, collection_name='topics')

class Pro(db.Model):

    pro_user = db.UserProperty()
    pro_content = db.StringProperty(multiline=True)
    pro_date = db.IntegerProperty(default=0)
    pro_topic = db.ReferenceProperty(Topics, collection_name='pros')    

class Con(db.Model):

    con_user = db.UserProperty()
    con_content = db.StringProperty(multiline=True)
    con_date = db.IntegerProperty(default=0)
    con_topic = db.ReferenceProperty(Topics, collection_name='cons')    

그리고 실제 페이지에 대한 한 가지 기능은 그룹 목록과 해당 주제 아래를 표시하려는 것입니다.

class Summary(webapp.RequestHandler):
    def get(self):

        groups_query = Groups.all()
        groups = groups_query.fetch(1000)
        template_values = {

            'groups': groups,           
        }

        path = os.path.join(os.path.dirname(__file__), 'summary.html')
        self.response.out.write(template.render(path, template_values))

그리고 마지막으로 HTML은 다음과 같습니다.

<html>
  <body>
    <a href="/newgroup">New Group</a>
    <br>
    {% for group in groups %}

    <font size="24">{{ group.group_name|escape }}</font><br> by <b>{{ group.group_user }}</b> at <b>{{ group.group_date }}</b> {{ group.raw_id }}
    <br>
    <a href="/newtopic?id={{group.key.id}}" >New topice </a>
    <br>
    <blockquote>
        {{ topics.topics_name }}
    </blockquote>


    {% endfor %}
  </body>
</html>
도움이 되었습니까?

해결책

저장소 변경(예: 새 개체 생성)과 같은 부작용이 있는 작업은 아니다 HTTP가 되다 GET -- GET은 기본적으로 "읽기" 작업만 수행해야 합니다.이것은 현학적인 것이 아니며 HTTP 의미론의 핵심입니다. 브라우저, 캐시, 프록시 등은 GET에서 읽기 전용 작업으로 작동하도록 허용됩니다(예: 결과를 캐싱하고 서버에 요청을 전달하지 않는 경우). 캐시에서 만족할 수 있습니다).

수정의 경우 POST(모든 브라우저가 이를 올바르게 구현하기 때문에 기본적으로 가장 많이 사용됨)와 같은 HTTP 동사를 사용하거나 특수 작업인 PUT(새 객체 생성) 또는 DELETE(객체 제거)를 사용합니다.다양한 브라우저를 지원하기 위해 POST를 사용할 것이라고 가정합니다.

브라우저에서 POST를 얻으려면 Javascript 마법사 또는 method=post를 사용하는 일반 기존 형식이 필요합니다. 단순화를 위해 후자를 가정하겠습니다.

Django 1.0(현재 앱 엔진에서 지원)을 사용하는 경우 모델을 기반으로 양식을 만들고, 검증하고, 수락하는 자체 메커니즘이 있습니다.다른 프레임워크에도 비슷한 고급 레이어가 있습니다.

"풍부한" 프레임워크를 피하려면 HTML 양식에 대한 템플릿을 직접 구현해야 하며 이를 지시해야 합니다(예: URL 디스패칭을 통해).app.yaml에서)을 구현하는 핸들러에 def post(self):, 요청에서 데이터를 가져오고, 유효성을 검사하고, 새 개체를 만들고, 넣고, 승인 페이지를 표시합니다.

절차 중 어떤 부분이 불분명합니까?귀하의 질문 제목은 특히 참조 속성에 초점을 맞추고 있지만 특히 어떤 문제가 발생하는지 잘 모르겠습니다. 질문 텍스트에서 귀하가 해당 속성에 대해 올바른 방향으로 가고 있는 것으로 보입니다.

편집하다:OP는 이제 자신의 문제가 다음과 같은 것을 만드는 방법이라는 의견을 통해 밝혔습니다.

"<a href="/newtopic?id={{group.key.id}}" >New topic </a>" 

일하다.이를 수행하는 방법은 여러 가지가 있습니다.새 주제 URL이 정적 양식에 의해 제공되는 경우 해당 양식의 게시물 "작업"에 대한 핸들러가 해당 양식으로 돌아갈 수 있습니다. id= 를 통해 Referer: 헤더(악명 높지만 수정할 수 없는 철자 오류)가 있지만 약간 투박하고 깨지기 쉽습니다.더 나은 방법은 다음을 수행하는 핸들러가 newtopic URI를 제공하도록 하는 것입니다. def get 얻는다 id= 요청에서 이를 결과 양식 템플릿(예: 숨겨진 입력 필드)에 삽입합니다.해당 양식의 템플릿에 다음 항목이 포함되도록 합니다(다른 필드 중에서).

<INPUT TYPE=hidden NAME=thegroupid VALUE={{ theid }}> </INPUT>

놓다 theid 해당 템플릿을 렌더링하는 컨텍스트에서 def post 양식을 수신하는 작업이 최종적으로 이루어집니다.

다른 팁

아마도 이것을 알아 낸 것처럼 다른 사람들을위한 질문에 대답하기 위해 :

class NewTopic(webapp.RequestHandler):
    def get(self):
      groupId = self.request.get('group')
      # either get the actual group object from the DB and initialize topic with topic_group=object as in 'Nick Johnson's answer, or do as follows
      topic = Topic()
      topic.name = self.request.get("topicname")
      topic.reference = groupId
      topic.put()

답장 해주셔서 감사합니다.

그래, 나는 get vs post를 알고있다. 내가 게시 한 수업은 실제로 모든 그룹 ()을 인쇄하는 것이 었습니다.

내가 가진 문제는 모델을 어떻게 사용하여 데이터를 일종의 계층 적 방식으로, 그룹> 주제> 장점/단점으로 어떻게 유지하는지 잘 모르겠다는 것입니다.

데이터를 잡는 것은 충분히 간단하고 다음을 사용하고 있습니다.

class NewGroupSubmit(webapp.RequestHandler):
    def post(self):

        group = Groups()
        if users.get_current_user():
            group.group_user = users.get_current_user()     
        group.group_name = self.request.get('groupname')

        group.put()
        self.redirect('/summary')

새로운 주제를 추가하려면 다른 기능이 필요합니다. 그 그룹 내에 저장합니다. 예를 들어 그룹이 "자동차"라고 가정 해 봅시다. 주제는 "Ferrari", "Porsche", "BMW"및 각 주제에 대한 장단점 일 수 있습니다. 나는 내가 조금 모호하다는 것을 알고 있지만, 나는 관계형 데이터베이스를 처음 접하고 용어에 익숙하지 않기 때문입니다.

나는 당신이 어떤 문제가 있는지 잘 모르겠습니다. 당신이 나열하는 모든 것이 잘 보입니다 - 참고 자료는 DSCRIPTION에서 기대할 수있는 것에 따라 설정됩니다. 내가 볼 수있는 유일한 문제는 템플릿에서 어디서나 정의되지 않은 변수 "주제"를 언급하고 있으며 어디에서나 그룹에 대한 주제를 반복하지 않는다는 것입니다. 당신은 다음과 같이 할 수 있습니다.

<html>
  <body>
    <a href="/newgroup">New Group</a>
    <br>
    {% for group in groups %}

    <font size="24">{{ group.group_name|escape }}</font><br> by <b>{{ group.group_user }}</b> at <b>{{ group.group_date }}</b> {{ group.raw_id }}
    <br>
    <a href="/newtopic?id={{group.key.id}}" >New topice </a>
    <br>
    Topics:
    <ul>
      {% for topic in group.topics %}
        <li>{{topic.topic_name}}</li>
      {% endfor %}
    </ul>
    {% endfor %}
  </body>
</html>

새로운 주제를 만들려면 필요한 인수를 전달하고 생성자를 사용하십시오.

mytopic = Topic(topic_name="foo", topic_group=somegroup)

여기서 일부 그룹은 그룹 객체이거나 그룹 객체의 키 여야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top