Справка django ModelForm - PullRequest
       1

Справка django ModelForm

0 голосов
/ 10 декабря 2010

Я работал с простой моделью и у меня возникли проблемы с сохранением данных ModelForm.Я хочу, чтобы пользователи могли создавать и редактировать существующие "Групповые" объекты в базе данных.Если пользователь выбирает «Редактировать» существующую группу, я хочу, чтобы полученная форма была предварительно заполнена существующими данными этих объектов.Затем, если они нажимают «Сохранить», он должен обновить любые измененные данные.Модель и вид, который я использую, ниже.Проблема в том, что form.is_valid () никогда не возвращает True.Что я тут не так делаю?

МОДЕЛЬ

class Analyst(models.Model):
    def __unicode__(self):
        return unicode("%s, %s"%(self.last, self.first))
    id = models.AutoField(primary_key=True)
    first = models.CharField(max_length=32)
    last = models.CharField(max_length=32)

class Alias(models.Model):
    def __unicode__(self):
        return unicode(self.alias)
    alias = models.CharField(max_length=32)

class Octet(models.Model):
    def __unicode__(self):
        return unicode(self.num)
    num = models.IntegerField(max_length=3)

class Group(models.Model):
    def __unicode__(self):
        return unicode(self.name)
    name = models.CharField(max_length=32, unique=True) #name of the group
    id = models.AutoField(primary_key=True) #primary key
    octets = models.ManyToManyField(Octet, blank=True) #not required
    aliases = models.ManyToManyField(Alias, blank=True) #not required
    analyst = models.ForeignKey(Analyst) #analyst assigned to group, required

ПРОСМОТР

class GroupEditForm(ModelForm):
    class Meta:
        model = Group

def index(request):
    if request.method == 'GET':
        groups = Group.objects.all().order_by('name')
        return render_to_response('groups.html', 
                                  { 'groups': groups, }, 
                                  context_instance = RequestContext(request),
                                  )

def edit(request):
    if request.method == "POST": #a group was selected and the submit button clicked on the index page
        form = GroupEditForm(instance = Group.objects.get(name=request.POST['name'])) #create a form and pre-populate existing data for that object
    elif request.method == "GET": #the "add new" button was clicked from the index page
        form = GroupEditForm() #create a new form with no data pre-populated

    return render_to_response('group_edit.html',
                             { 'form': form,  },
                             context_instance = RequestContext(request),
                             )

def save(request):
    if request.method == "POST":
        form = GroupEditForm(request.POST)
        if form.is_valid():
            form.save()
            return HttpResponseRedirect('/groups/')

и соответствующий шаблон

Шаблон

<h1>Edit Group Information</h1>
<form method="post" action="/groups/edit/save/">{% csrf_token %}
<div class="edit">
<br></br>
{{form}}
</div>
<br></br>
<input type="submit" value="Save"> 
<a href="/groups/"><input type="button" name="cancel" value="Cancel" /></a>
</form>

Ответы [ 2 ]

2 голосов
/ 11 декабря 2010

Попробуйте использовать django-debug-toolbar . Прикрепите его к своему проекту, и вы сможете увидеть, что настраивается в вашей форме, возможно, почему он не проходит проверку. Очень легко начать работу, так что попробуйте.

1 голос
/ 11 декабря 2010

Требуется ли вашему проекту класс ModelForm?

Django хорошо проверит ваши модели, если узнает о форме.

http://docs.djangoproject.com/en/1.2/topics/forms/modelforms/

Несколько примечаний к вашему коду:

Метод должен прийти после того, как вы объявите свою модель, и вы можете пропустить "Unicode":

def __unicode__(self):
    return unicode("%s, %s"%(self.last, self.first))

становится,

def __unicode__(self):
    return "%s, %s" % (self.last, self.first)

Также вам это не нужно:

id = models.AutoField (primary_key = True)

поскольку django делает это для вас, если вы не указываете другие поля как "primary_key = True"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...