Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Django ModelForm Template?

I want to learn how can I add to template to my ModelForm i'm newbie. Below you can see my models.py, url.py and views.py:

My model.py looks like that:

from django.db import models   
from django.forms import ModelForm
from django.contrib.auth.models import User

class Yazilar(models.Model):
    yazi = models.CharField(max_length=200)    
    temsilci = models.ForeignKey(User)

class YaziForm(ModelForm):        
    class Meta: 
        model = Yazilar

My views.py function is below:

@login_required 
def yazi_ekle(request):
    yazim = YaziForm
    return render_to_response('yazi/save.html', {'YaziForm': YaziForm})

My url.conf looks like below:

(r'^yazi/save/$', 'tryout.yazi.views.yazi_ekle'),

My question is about creating a form and what is that forms "action" parameter?

like image 421
dr.linux Avatar asked Feb 17 '10 14:02

dr.linux


2 Answers

It seems to me that your problem is in the view, you should be doing something like this:

@login_required
def yazi_ekle(request):
        yazim = YaziForm() # Look at the (), they are needed for instantiation
        return render_to_response('yazi/save.html', {'YaziForm': yazim}) # Sending the form instance to the context, not the form class

Now, you have a variable named YaziForm in your template context. Django forms autorender to a bunch of table rows with the widgets as default, so in your file yazi/save.html, do this

<form method="post" action="">
{% csrf_token %}
<table>
{{YaziForm}}
</table>
<input type="submit" value="Submit Form"/>
</form>

That will render your form as a table automatically, though you have to add the logic for the form under POST.

like image 100
Jj. Avatar answered Oct 14 '22 10:10

Jj.


You could in fact use <form action=""> since the url you want to post to is the same as the page you are on.

If you don't like that then as long as you have 'django.core.context_processors.request' in your TEMPLATE_CONTEXT_PROCESSORS in settings.py I think you could also do:

<form action="{{ request.path }}">

As always, see the docs :)

http://docs.djangoproject.com/en/1.1/ref/request-response/#django.http.HttpRequest.path

EDIT

In case, in the intervening year since this question was posted, the poster still hasn't tried to read the ModelForm docs... http://docs.djangoproject.com/en/1.2/topics/forms/modelforms/

Yes the view is wrong, you have instantiate the form. You also want some logic to handle the post data. If it's an edit view you probably also want the view to take an item id in the view args and have some logic to load that model instance.

eg:

@login_required
def yazi_ekle(request, id=None):
    form_args = {}
    if id is not None:
        # edit an existing Yazilar
        try:
            yazilar = Yazilar.objects.get(pk=id)
        except Yazilar.DoesNotExist:
            return Http404('Yazilar not found')
        form_args['instance'] = yazilar
    # else create new Yazilar...        

    if request.POST:
        form_args['data'] = request.POST
        yazi_form = YaziForm(**form_args)
        if yazi_form.is_valid():
            yazilar = yazi_form.save(commit=True)
    else:
        yazi_form = YaziForm(**form_args)

    return render_to_response('yazi/save.html',
        {
            'yazi_form': yazi_form
        },
        context_instance=RequestContext(request)
    )

then in your urls.py something like:

(r'^yazi/ekle/(?P<id>\d+)?$', 'tryout.yazi.views.yazi_ekle'),

and in the template:

<form method="post" action="">
{% csrf_token %}<!-- required since Django 1.2 or later -->
<ul>
    {{ yazi_form.as_ul }}
</ul>
<input type="submit" value="Submit Form"/>
</form>
like image 2
Anentropic Avatar answered Oct 14 '22 09:10

Anentropic