Pergunta

Eu estou tentando obter meus modelos relacionados usando ReferenceProperty, mas não tem uma enorme quantidade de sorte. Eu tenho 3 níveis: grupo, tópico, em seguida, Prós e Contras. Como em um grupo abriga muitos temas, e dentro de cada tópico pode ser muitos prós e contras.

Eu sou capaz de armazenar novos Grupos agradável e bem, mas eu não tenho nenhuma idéia de como armazenar temas subjacentes a esses grupos. Quero link de uma página com um link "Novo tópico" debaixo de cada grupo, que os leva a uma forma simples (1 campo por agora). Obviamente, o URL precisa ter algum tipo de referência ao ID do grupo ou algo assim.

Aqui estão os meus modelos:

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')    

E uma função para a página real Eu quero mostrar a lista de grupos e, em seguida, debaixo de suas tópicos:

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))

E, finalmente, o 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>
Foi útil?

Solução

Algo que tem efeitos colaterais, tais como alterar a loja (através da criação de um novo objeto, por exemplo) deve não ser um HTTP GET - GET deve essencialmente apenas que "ler" as operações. Este não é pedantismo, é um pouco chave de HTTP semântica - navegadores, caches, proxies, etc, estão autorizados a agir em GET como operações de somente leitura (por exemplo, armazenando os resultados e não passar um pedido para o servidor se eles pode satisfazer-lo do cache).

Para modificações, use HTTP verbos tais como POST (o mais popular essencialmente porque todos os navegadores implementá-lo corretamente) ou para PUT operações especializadas (para criar novos objetos) ou DELETE (para remover objetos). Eu suponho que você estará indo para usar POST para apoiar uma variedade de browsers.

Para obter um POST a partir de um navegador, você precisa de Javascript wizardy ou uma forma velha e simples com o método = post -. Eu vou assumir este último para a simplicidade

Se você estiver usando Django 1.0 (que App Engine suporta agora), que tem seus próprios mecanismos para fazer, validar e aceitar formas baseadas em modelos. Outros quadros têm suas próprias camadas semelhante avançadas.

Se você quer evitar estruturas "ricos" você vai ter que implementar por modelos de mão para seus formulários HTML, encaminhá-los (através de algum tipo de URL de expedição, por exemplo, em app.yaml) para um manipulador de sua implementação com um def post(self):, obter os dados do pedido, validá-lo, formar o novo objeto, colocá-lo, exibir alguma página de confirmação.

Que parte ou partes do processo não são claras para você? O título do seu questão centra-se especificamente sobre as propriedades de referência, mas não tenho certeza qual é o problema que eles estão dando-lhe em particular -. a partir do texto da sua pergunta você parece estar no rumo certo sobre eles

Editar : o OP já esclareceu em um comentário que o seu problema é como fazer algo como:

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

trabalho. Há mais de uma maneira de fazer isso. Se o URL newtopic é servido por uma forma estática, o manipulador para o cargo "ação" de que forma poderia voltar para que id= via o cabeçalho Referer: (a notória mas unfixable mis-ortografia), mas isso é um desajeitado pouco e frágil. Melhor é ter a URI newtopic servido por um manipulador cujo def get recebe o id= a partir da solicitação e insere-o no modelo de formulário resultando - por exemplo, em um campo de entrada oculto. Tenha conter modelo que de forma (entre outros campos):

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

put theid no contexto com o qual você tornar esse modelo, e será no pedido que o def post da ação de receber o formulário finalmente consegue.

Outras dicas

Apenas para responder a pergunta para os outros como você provavelmente descobriu isso:

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()

Obrigado pela resposta.

Sim, eu estou ciente do get vs post. A classe eu postei foi apenas para realmente imprimir todos os Grupos ().

O problema que tenho é que estou inseguro como eu uso os modelos para manter os dados em uma espécie de forma hierárquica, com Groups> Tópicos> Pros / Cons.

Agarrando dados é bastante simples e estou usando:

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')

Eu preciso uma outra função para adicionar um novo tópico, que armazena dentro desse grupo. Então, vamos dizer que um grupo é "Carros", por exemplo; os temas pode ser "Ferrari", "Porsche", "BMW", e, em seguida, vantagens / desvantagens para cada tópico. Eu percebo que estou sendo um pouco vaga, mas é porque eu sou muito novo para databasing relacional e não bastante utilizado para a terminologia.

Eu não estou completamente certo o problema que você está tendo. Tudo o que você listar parece bem - ReferenceProperties são configurados de acordo com o que seria de esperar de seu Dscription. O único problema que vejo é que, em seu modelo, você está se referindo a uma variável "tópicos", que não é definida em qualquer lugar, e você não está interagindo através dos tópicos para um qualquer lugar do grupo. Você pode fazer isso como este:

<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>

Para criar um novo tópico, basta usar o construtor, passando os argumentos necessários:

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

Aqui, somegroup deve ser um objeto Grupo, ou uma chave para um objeto Grupo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top