[Grok-dev] Re: Referencing objects by id
    Philipp von Weitershausen 
    philipp at weitershausen.de
       
    Sun Aug  3 06:35:15 EDT 2008
    
    
  
Gerard Petersen wrote:
> Hi All,
> 
> 1st, forgive my n00bishness. I'm on Grok for a net time of only a couple 
> of days now. Anyway ..
> 
> Im trying to get my head around storing objects (Customers that is) 
> based on customer id's. An url should look like this:
> 
>     http://localhost:8080/gpadmin/1
> 
> It was previously (working and) based on company name and used to look 
> like this:
> 
>     http://localhost:8080/gpadmin/Customer
> 
> I use zope's interface and schema to work with the model and suppress 
> the id field in forms with:
> 
> "form_fields = grok.AutoFields(Customer).omit('id')"
> 
> Because of this I have to calculate a new id before storing a new 
> customer object. From a MVC perspective I think the 'get new id' code 
> belongs in the model class but that's a different story.
Sure, you can do that. However, you probably want these IDs to be unique 
throughout a particular range, so the model would have to know about 
existing IDs somehow. That typically means it needs to know at creation 
time which container it's being added to.
> The error I get wanting to set the value for id is this:
> 
>     TypeError: 'Customer' object does not support item assignment
> 
> The snippet I use it in is this:
> 
> def handle_voeg_toe(self, **data):
>    customer = Customer()
> 
>    values = list(self.context.values())
>    new_id = str(len(values) + 1)
> 
>    # It breaks here!!!!
>    customer['id'] = new_id
You're doing item assignment here but that's typically only supported by 
dict-like objects (e.g. containers). Hence the error message that it 
doesn't support item assignment.
You want to assign a simple attribute:
      customer.id = new_id
>    self.context['id'] = customer
>    self.applyData(customer, **data)
>    self.redirect(self.url('index'))
> 
> 
> Changing/replacing the line in the snippet after the break point with this:
> 
>    self.context[new_id] = customer
> 
> Seemingly works because I can use this:
> 
>     http://localhost:8080/gpadmin/1
> 
> But then the actual 'id' attribute is not filled.
> 
> If more code or information is needed to clearify I'll gladly post it, 
> but I consider this email long already ... :-)
    
    
More information about the Grok-dev
mailing list