2017-06-07 2 views
0

Ich habe die folgenden Modelle, Ansicht und Vorlage:Django - Wie fügt man Daten zu einem ManyToMany-Feldmodell hinzu?

models.py:

class Batch(models.Model): 
    material_id = models.ManyToManyField(AssetMetadata) 
    user = models.ForeignKey(User) 

    def __str__(self): 
     return 'Batch_' + str(self.pk) + '_' + self.user.username 

class AssetMetadata(models.Model): 

    material_id = models.CharField(max_length=256, blank=True) 
    series_title = models.CharField(max_length=256, blank=True) 
    season_title = models.CharField(max_length=256, blank=True) 
    season_number = models.IntegerField(default=0) 
    episode_title = models.CharField(max_length=256, blank=True) 
    episode_number = models.IntegerField(default=0) 
    synopsis = models.TextField(max_length=1024, blank=True) 
    ratings = models.CharField(max_length=256, blank=True) 

    def __str__(self): 
     return self.material_id 

views.py:

def assets_in_repo(request): 

    asset_list = AssetMetadata.objects.order_by('id').all() 
    page = request.GET.get('page', 1) 
    paginator = Paginator(asset_list, 50) 

    try: 
     assets = paginator.page(page) 
    except PageNotAnInteger: 
     assets = paginator.page(1) 
    except EmptyPage: 
     assets = paginator.page(paginator.num_pages) 

    if request.method == 'POST': 

     batch_list = request.POST.getlist('batch') 
     print(batch_list) 

    return render(request, 'assets_db/assets.html', {'assets': assets}) 

Ausschnitt aus Vorlage:

<form method="post">{% csrf_token %} 
    <input type="submit" value="Create Batch" align="right"> 
    <table class="table table-striped" id="myTable"> 
     <tr> 
      <th>ID</th> 
      <th>Material ID</th> 
      <th>Series Title</th> 
      <th>Season Tile</th> 
      <th>Season Number</th> 
      <th>Episode Title</th> 
      <th>Episode Number</th> 
      <th>Create Batch</th> 
     </tr> 
     {% for i in assets %}<tr> 
      <td>{{i.pk}}</td> 
      <td><a href="/repo/{{ i.id}}">{{i.material_id}}</a></td> 
      <td>{{i.series_title}}</td> 
      <td>{{i.season_title}}</td> 
      <td>{{i.season_number}}</td> 
      <td>{{i.episode_title}}</td> 
      <td>{{i.episode_number}}</td> 
      <td> 
       <input type="checkbox" name="batch" value="{{i.pk}}"> 
      </td> 
     </tr>{% endfor %} 
    </table> 
    </form> 

I Ich versuche, die Daten von der Checkbox zu bekommen und speichern sie in der Batch Modell.

Der Benutzer wählt Anlagen zum Erstellen einer Charge, das Formular gibt die pk für diese Anlagen in AssetMetadata zurück und die Auswahl wird in einer Liste gespeichert, die über batch_list = request.POST.getlist('batch') erstellt wird. Ich möchte die Daten verwenden, die in dieser Liste gespeichert sind, um einen neuen Eintrag in Batch zu erstellen, der dann zu dem Element pk in AssetMetadata verknüpft.

Ich konnte dies erfolgreich in der Django Admin-Seite tun, aber ich würde dies idealerweise in der Ansicht tun.

Ich habe gelesen https://docs.djangoproject.com/en/1.10/ref/models/relations/ und stackoverflow suchen, aber ich bin ratlos, wie dies zu tun ist.

+0

Randbemerkung, Ihre Definition des Felds 'ID' im Feld 'AssetMetadata' erfüllt definitiv nicht das, was Sie erwarten. Es definiert nur ein Klassenattribut namens "id" mit einem statischen Wert von was auch immer "auto_creation_counter" zum Zeitpunkt des Imports ist. –

+0

Ja, das ist was ich will, im Grunde erhöht es sich, wenn neue Assets zum Archiv hinzugefügt werden. – Lewis909

+0

Aber es * nicht *, das ist mein Punkt. Es ist ein statischer Wert, der für die * Klasse als Ganzes gesetzt ist und beim Import gesetzt wird. Django gibt Modellen automatisch einen Primärschlüsselwert, der automatisch erhöht wird. –

Antwort

1
info = Batch.objects.create(season_title ='foo', .....) 
info2= AssetMetadata.objects.create(material_id ='some') 
info.material_id.add(info2) 

versuchen so etwas wie dieses

0

Ich glaube, Sie brauchen

obj = AssetMetadata.objects.get(id=pk) 
obj.batch_set.add(* batch_list) 
0

Dank von beiden Antworten zu helfen, konnte ich diese Funktion erhalten, das ist, wie ich es tat:

def assets_in_repo(request): 

    asset_list = AssetMetadata.objects.order_by('id').all() 
    page = request.GET.get('page', 1) 
    paginator = Paginator(asset_list, 50) 

    try: 
     assets = paginator.page(page) 
    except PageNotAnInteger: 
     assets = paginator.page(1) 
    except EmptyPage: 
     assets = paginator.page(paginator.num_pages) 

    if request.method == 'POST': 

     batch_list = request.POST.getlist('batch') 

     info = Batch.objects.create(user_id=request.user.id) 
     for item in batch_list: 
      info.material_id.add(item) 
Verwandte Themen