Hacker Newsnew | past | comments | ask | show | jobs | submit | chubuntu's commentslogin

How did you solve the problem of bypassing modelforms? Same roadblock here...


you reference the model in the view and then tell the view to save it directly to the model using the "model = form field" type syntax to assign value and then .save() method to save.

In the form field you are saving from, you write the form field value and then an empty space where the input value goes sort of like "form.cleaned_data.get("field name", " "). The second blank ""is the empty space where the field value goes. The claned_data is django's internal form validator. That sounds confusing so I'll give an example

This is what your views would look like

    from django.shortcuts import render

    from sample.models import Test

    from sample.forms import TestForm

    def Example(request):

       if request.method == 'POST':

           form = TestForm(request.POST)

           if form.is_valid():

              testmodel = Test()

              testmodel.modelfield1 = form.cleaned_data.get('formfield1','')

              testmodel.modelfield2 = form.cleaned_data.get('formfield2','')

              testmodel.save()
            
              return render(request, 'sample/nextpage.html') 

        else:

            form =TestForm

            context_data = {'form':form}

            return render(request, 'sample/testformpage.html', context_data)


"The second blank ""is the empty space where the field value goes."

I'm not sure I understand what you're saying here, but I don't think this is right. cleaned_data is a dictionary, and so the second argument to get is a default value to use if there is no value corresponding to the key. So, in your example, if there's no value for "formfield1" in cleaned_data, it would return a string with a space in.

This is probably not what you want to do. cleaned_data will always contain values for declared form fields, so the only way the default would be used is if you've made a mistake in specifying the key (for instance, if there's a typo and you've written 'formfeild1' instead of 'formfield1'). If you've made that kind of mistake, you don't want the program to continue using a single space instead of the valid data (you'll lose data) - you want the program to report that there's something wrong.

So I think you should probably use

    form.cleaned_data['formfield1']
which will do the same thing if formfield1 is a real field name specified in the form, but will raise an exception if it isn't.


Sorry typo, it should be the second blank is the empty space where the user input goes.

I just tried your solution with cleaned_data["formfield1"] instead of cleaned_data("formfield1","") and it didn't work for me, it came back with the following error message when I submitted the form:

>'builtin_function_or_method' object is not subscriptable

I think you have to have the empty quotes after the form field and I think that's what's capturing the user input

so here "form.cleaned_data("formfield1","") seems to be telling django the form name and then the second field is where the associated user input goes which is then passed to the model.


wait just tried the code again, you were right, I don't need the second empty string. I was using [] with get and it wasn't working.

so it seems the right way is form.cleaned_data.get('formfieldvalue')

or

form.cleaned_data[formfieldvalue']

if you don't want to use get


Alternative is to use the modelform but not save the created/updated model automatically. Then you modify the resulting model object and save it manually as needed.

Works also with models with m2m fields with Form.save_m2m().


Thank you


This is helpful and gives me some new ideas to try. Thankyouverymuch


Asterisk show up fine if followed by white space * ... The question is how to show (asterisk)nix?

Apparently three asterisks + nix = *nix


Ha! Funny enough, triple asterisk actually renders as <i></i>* - an empty <i> tag followed by a single asterisk. Oh, HN, you. But thank you, something that visually renders properly.


I have taken to using _ as an alternative...


I go for ^nix


Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: