2017-01-05 2 views
3

ich ein Modell haben Benutzer Beitrag zu speichern:django Admin fügt keine Objekte in ManyToMany Felder

class Tag(models.Model): 
    name = models.CharField(max_length=255, unique=True) 

class Post(models.Model): 
    user = models.ForeignKey(User) 
    body = models.TextField() 
    tags = models.ManyToManyField(Tag, blank=True) 
    pub_date = models.DateTimeField(default=timezone.now) 
    activity = GenericRelation(Activity, related_query_name="posts") 

Nun, wenn ich einen neuen Beitrag Objekt zu speichern, würde Ich mag den Beitrag Objekt des Körpers in die Post-Objekts speichern Tags Feld. Ich tue dies unter Verwendung der Signale:

@receiver(post_save, sender=Post) 
def create(sender, instance, **kwargs): 
    if kwargs.get('created', True): 
     tag_list = [Tag.objects.create(name=word) for word in instance.body.split()] 
     print "from signals!: instance body: %s" % instance.body 
     instance.tags.add(*tag_list) 

    if not kwargs.get('created', False): 
     tag_list = [Tag.objects.create(name=word) for word in instance.body.split()] 
     print "already signals!: instance body: %s" % instance.body 
     instance.tags.add(*tag_list) 

Also, wenn ich ein neues Objekt Beitrag im Admin speichern, einen neuen Beitrag Objekt schafft, auch Tag-Objekte in tag_list erstellen. Aber ... es fügt die Tags aus tags_list nicht in das Feld "Viele zu viele" des Objekts ein (d. H. Post_object.tags).

Wenn ich jedoch ein neues Post-Objekt aus der Shell erzeuge, erstellt es ein neues Post-Objekt, erstellt Tag-Objekte in tag_list und fügt die Tags auch in das post.objects-Tag-Feld ein.

Was mache ich hier falsch? Es scheint, dass das Problem in Django Admin ist.

+0

Beide 'if's verweisen auf gleiche Logik :) – ruddra

+2

@ruddra Meine Frage ist völlig anders. – Robin

+0

Entschuldigung mein Fehler. Entfernt – ruddra

Antwort

1

Nachdem ich viel gesucht habe, habe ich endlich mein Problem gelöst. Es stellt sich also heraus, dass wenn Sie versuchen, etwas mit dem M2M-Feld im Admin zu tun, die Änderung automatisch durch clear() gelöscht wird.

Also, ich hatte eine neue Modell Admin-Klasse zu machen:

class PostAdmin(admin.ModelAdmin): 
    class Meta: 
     model = Post 

    def save_model(self, request, obj, form, change): 
     print "from save_model" 
     obj.save() 

    def save_related(self, request, form, formsets, change): 
     super(PostAdmin, self).save_related(request, form, formsets, change) 
     obj = form.instance 
     if obj.body: 
      tag_list = [Tag.objects.get_or_create(name=word)[0] for word in obj.body.split() if word.startswith("#")] 
      obj.tags.add(*tag_list) 
      print("from save_related") 
      obj.save() 

admin.site.register(Post, PostAdmin) 

Auch änderte ich, wie ich Liste von Tags machte als @Prakhar create()-get_or_create() darauf hingewiesen. Hinweis die Indizierung [0] während get_or_create(), um die Instanz und nicht die created zu erhalten.

signals.py:

@receiver(post_save, sender=Post) 
def create(sender, instance, **kwargs): 
    if kwargs.get('created', True): 
     tag_list = [Tag.objects.get_or_create(name=word)[0] for word in instance.body.split() if word.startswith("#")] 
     print "from signals!: instance body: %s" % instance.body 
     instance.tags.add(*tag_list) 
    else: 
     tag_list = [Tag.objects.get_or_create(name=word)[0] for word in instance.body.split() if word.startswith("#")] 
     print "already signals!: instance body: %s" % instance.body 
     instance.tags.add(*tag_list) 
Verwandte Themen