2012-06-12 4 views
1

J'essaie de créer une vue dans laquelle l'utilisateur peut modifier les enregistrements de base de données via un formulaire dans un modèle. J'ai cherché beaucoup de pages Web (et aussi de docs Django) où elles enseignent comment faire ces vues, mais elles utilisent toujours le "id" que Django génère pour chaque modèle. Dans ce modèle particulier, je dois utiliser un AutoField pour remplacer le "id". Est-il possible d'utiliser ce AutoField comme un "id" de l'enregistrement avec Django?Django: Modifier ModelForm à l'aide de AutoField

Voici mon modèle complet:

class T031003 (models.Model): 
    C003IDCD = AutoField(primary_key=True) 
    C003INST = models.IntegerField(unique=True) #usar AutoSlug 
    C003TPCD = models.CharField(max_length=1) 
    C003CHCD = models.CharField(max_length=14) 
    C003MTR = models.CharField(max_length=30, blank=True, null=True) 
    C003CTCD = models.CharField(max_length=3) 
    C003RZSC = models.CharField(max_length=60, blank=True, null=True) 
    C003EML = models.EmailField(max_length = 254, blank=True, null=True) 
    C003LOGA = models.CharField(max_length=20) 
    C003LOGB = models.DateTimeField() 
    C003LOGD = models.CharField(max_length=15, blank=True, null=True) 
    C003LOGF = models.CharField(max_length=20, blank=True, null=True) 

    def __unicode__(self): 
     return '%s' % self.C003MTR 

    class T031003Form(ModelForm): 
     class Meta: 
      model = T031003 
      ordering = ["-C003MTR"] 
      exclude = ('C003LOGA','C003LOGB','C003LOGD','C003LOGE','C003LOGF') 

Et voici la vue que j'ai essayé de le faire, mais il me donne l'erreur « Aucun T031003 correspond à la requête donnée. » et c'est vrai, puisqu'il n'y a pas "id" dans le tableau:

def t031003form_edit(request, id=None): 
pin = get_object_or_404(T031003, pk=id) 
form = T031003Form(request.POST or None, instance=pin) 
if request.method == 'POST': 
    if form.is_valid(): 
     form = form.save(False) 
     form.C003LOGA = request.user 
     form.C003LOGB = datetime.date.today() 
     form.C003LOGD = request.META['REMOTE_ADDR'] 
     form.C003LOGF = request.META['USERDOMAIN'] 
     form.save() 
     form = T031003Form() 
    else: 
     return HttpResponseRedirect('/erro/') 
return render_to_response('T031003Form_edit.html', {'form': form,}, context_instance=RequestContext(request)) 

Toute aide serait très appréciée!

Répondre

0

Eh bien, grâce à l'aide d'un ami proche, je pourrais faire l'affaire en utilisant formsets. Voici la vue:

def t031002form_edit(request, id_auto): 
j = get_object_or_404(T031002, pk=id_auto) 

T031003FormSet = modelformset_factory(T031002, can_delete=True, max_num=1) 

if request.method == 'POST': 
    form = T031002FormSet(request.POST or None, request.FILES or None, queryset=T031002.objects.filter(pk=id_auto)) 
    if form.is_valid(): 
     instance = form.save(commit=False) 
     form.C003LOGA = request.user 
     form.C003LOGB = datetime.date.today() 
     form.C003LOGD = request.META['REMOTE_ADDR'] 
     form.C003LOGF = request.META['USERDOMAIN'] 
     for reform in instance: 
      reform.save() 
    else: 
     return HttpResponseRedirect('/erro/') 
else: 
    form = T031002FormSet(queryset=T031002.objects.filter(pk=id_auto)) 
return render_to_response(('T031002Form_edit.html'), {'form': form,}, context_instance=RequestContext(request)) 

Ainsi, avec formsets, vous pouvez travailler bien et sans soucis. J'espère que cela aide les autres avec ce même questionnement.

+0

Juste un petit plus: ce "id_auto" est une valeur que vous allez passer à travers l'URL. Dans votre urls.py vous aurez 'url (r '^ t031002form_edit/(? P \ d +) /', 'Mod031.views.t031002form_edit')' et dans le template, vous passerez quelque chose comme:/t031002form_edit/1/Cela vous mènera à l'enregistrement dans la base de données où "id" est égal à 1 (et l'id dans ce cas est l'AutoField). –

0

Si un modèle a une AutoField - une clé primaire auto-incrémentée - alors que la valeur auto-incrémentée sera calculée et enregistrée comme un attribut sur votre objet la première fois que vous STOCKER():

>>> b2 = Blog(name='Cheddar Talk', tagline='Thoughts on cheese.') 
>>> b2.id  # Returns None, because b doesn't have an ID yet. 
>>> b2.save() 
>>> b2.id  # Returns the ID of your new object. 

Il n'y a aucun moyen de dire quelle sera la valeur d'un ID avant d'appeler save(), car cette valeur est calculée par votre base de données, et non par Django.

ref: https://docs.djangoproject.com/en/dev/ref/models/instances/?from=olddocs

+0

Merci pour l'explication! Donc, si j'ai déjà quelques enregistrements dans cette base de données et que je n'ai pas le "id" à cause de l'AutoField que j'ai utilisé dans mon modèle l'a surchargé, comment puis-je modifier un enregistrement précis? Quels paramètres dois-je passer à la méthode? –

+0

Désolé je n'ai pas compris votre point sur la méthode et le montage? –

+0

Si je ne donne pas le "id" en tant que paramètre pour identifier quel enregistrement dans la base de données que je veux modifier, 'def t031003form_edit (request, id = None):' alors que dois-je passer? Par exemple, dans le "def", si je place pk = 1 au lieu de pk = id, il choisit toujours le premier enregistrement de la table à modifier à travers la vue. Mais si je veux modifier un enregistrement à travers une vue, comment puis-je identifier quel enregistrement je modifie? Merci pour votre patience, c'est juste que cette chose est un peu rude pour moi de comprendre comment cela fonctionne. –