[Baypiggies] Django | Clean Design Question

Robert Zuber rob at zuber.net
Tue May 12 03:03:16 CEST 2009


Glen,

Have you looked at the 'prefix' keyword arg for forms?  If I'm  
understanding your problem correctly, I think that's what it's for.

I just looked it up in the docs and found it here:
http://docs.djangoproject.com/en/dev/ref/forms/api/#prefixes-for-forms

It doesn't seem as clear as I remember it being, so if you need more  
details, please feel free to ask.

Cheers,
Rob.


On May 11, 2009, at 11:30 AM, Glen Jarvis wrote:

> Since I've been using Django this past year, I've slowly learned how  
> to be more dynamic and DRY using the Django framework.
>
> For example, in the very beginning, if I were using newforms (now  
> forms), I would create a form that mimic'ed the model (unless  
> modelforms were really easy).
>
> Now, I've been using model forms and doing something like this for  
> quite a while:
>
> from django.forms import ModelForm
>
> class PIGDemoForm(ModelForm):
>     class Meta:
>         model = Grant
>
>     def __init__(self, *args, **kwargs):
>         super(PIGDemoForm, self).__init__(*args, **kwargs)
>         self.fields['date_received'].widget =\
>             forms.TextInput(attrs={'class': 'date-pick'})
>         ...etc...
>
>
> Now, I have two models, we'll call model1 and model2. And, they both  
> have a name attribute. Because I normalize data, I never do  
> something like "model1.model1_name", but instead "model1.name." But,  
> it's getting me in trouble.
>
> Both forms have a 'name' attribute. And, both forms are in a  
> template together. (I mean that both form instances are created for  
> the specific instance of the model in question, and are displayed  
> together (very interleaved) in a template). The response that I get  
> back, via request.POST instantiates both forms:
>
> form1 = Form1(request.POST, instance=blah1)
> form2 = Form2(request.POST, instance=blah2)
>
> [Note I'm translating this from a domain specific problem to generic  
> (form1, form2, etc.) on the fly. There's room for error]
>
> Now, if request.POST has only one 'name' then form1 and form2 are  
> getting the same name, obviously causing a problem.
>
> My question is specific to a better design. I see the following  
> options (did I miss any):
> 1) Manually create one form that mimics model1 and model2 together  
> (violates DRY, and makes verbose and less useable code)
>
> 2) Change my model names to be something like (model1.model1_name,  
> model2.model2_name). This violates normalization rules (and has an  
> impact on other code already written).
>
> 3) Try 'hacking' the form temporarily... something like:
>
>    def __init__(self, *args, **kwargs):
>        super(blah blah blah)
>
>        blah blah
>
>        self.fields['grant_name'] = self.fields['name']
>
>        If this third option is chosen, I need to either:
>
>         a) move the self.fields['grant_name'] back to  
> self.fields['name'] before using the form shortcut save() method,  
> [and I scratch my head on how. Do I need to look at the pre-save  
> signals, etc.]
>         b) Create a new model manually, specifying a mapping of  
> "self.cleaned_data['grant_name']" to the model's "name" property.  
> This has the same feel (redundant and less dynamic) as the above  
> solutions, but may be the best we can do in this situation.
>
> Please note that the database is laid out in a very normalized  
> manner per the request of the IT department of my customer. The  
> user, however, doesn't understand these differences *at all* and  
> just wants his data to look like it does when he types in a  
> spreadsheet. So, there are competing design paradigms coming from  
> two different people. That difference is something we're going to  
> have to live with in this design.
>
> When I start getting into this kind of place, I think it's time for  
> me to stop, put the keyboard down, and think... This is a very  
> common design pattern: what do most people do?
>
>
> Thanks for listening and any fresh perspective would be welcomed.
>
>
> All the best,
>
>
> Glen Jarvis
> --
> "You must be the change you wish to see in the world." -M. Gandhi
> _______________________________________________
> Baypiggies mailing list
> Baypiggies at python.org
> To change your subscription options or unsubscribe:
> http://mail.python.org/mailman/listinfo/baypiggies



More information about the Baypiggies mailing list