2017-11-13 5 views
0

Dies ist meine erste Django App, um mir (und meiner Firma) zu beweisen, dass wir Django adoptieren sollten, aber bis jetzt hat es sich als schwierig erwiesen.Django mit multiplen ManyToManyField Formular

Ich versuche, eine App zu erstellen, die alle Mitarbeiter eines Unternehmens und für jeden einzelnen die vielen Fähigkeiten des Mitarbeiters zeigt, die in Kategorien organisiert sind. Hier ist mein Modell:

from django.db import models 

class Category(models.Model): 
    name = models.CharField(max_length=64) 

    def __str__(self):    # __unicode__ on Python 2 
     return self.name 

class Skill(models.Model): 
    category = models.ForeignKey(Category, on_delete=models.CASCADE) 
    name = models.CharField(max_length=64) 

    def __str__(self):    # __unicode__ on Python 2 
     return self.name 

class Employee(models.Model): 
    login = models.CharField(max_length=16) 
    fullname = models.CharField(max_length=64) 
    skills = models.ManyToManyField(Skill, through='EmployeeSkill') 

    def __str__(self):    # __unicode__ on Python 2 
     return self.fullname 

class EmployeeSkill(models.Model): 
    employee = models.ForeignKey(Employee, on_delete=models.CASCADE) 
    skill = models.ForeignKey(Skill, on_delete=models.CASCADE) 
    LEVELS = (
     ('0', 'None'), 
     ('1', 'Very Basic Knowledge (hours)'), 
     ('2', 'Basic Knowledge (days)'), 
     ('3', 'Good Understanding Knowledge (weeks)'), 
     ('4', 'Excellent Knowledge (months)'), 
     ('5', 'Expert Knowledge (years)'), 
    ) 
    level = models.CharField(max_length=1, choices=LEVELS) 
    desired_level = models.CharField(max_length=1, choices=LEVELS) 

    def __str__(self): 
     return "{} level of knowledge for {} is {}/desired is {}".format(self.employee.fullname, self.skill.name, self.level, self.desired_level) 

Ich bin in der Lage einen Mitarbeiter, eine Fähigkeit und einen EmployeeSkill, zu erstellen und sogar für einen bestimmten Mitarbeiter alle Fähigkeiten der Mitarbeiter zeigen aber, wo ich bin zu kämpfen, wie ich gehen sollte Erstellen eines Formulars, das alle möglichen EmployeeSkills für einen Mitarbeiter anzeigt und es diesem Mitarbeiter ermöglicht, die mit jedem EmployeeSkill verknüpfte Ebene (und den gewünschten_Level) zu ändern.

Bitte helfen!

Antwort

1

Sie können eine Auswahl für die Optionen auf ManyToManyField generieren und jede Option auf der Auswahl rendern und die Werte mithilfe von AJAX hinzufügen.


<select name="material" id="id_material" required> 
    <option value="0" disabled selected>Selecciona el material</option> 
    {% for material in materiales %} 
     <option value="{{material.id}}">{{material.descripcion}} ({{material.id_tipo_material.unidad}}) - Total = {{material.cantidad}}</option> 
    {% endfor %} 
</select> 

Und die AJAX Anfrage:

function agrega_material(){ 

     var url = '{% url "paquetes:agrega_material_paquete" %}'; 

     var paquete = $('#id_cantidad').data('paquete'); 

     var material = $('#id_material').val(); 

     var cantidad = $('#id_cantidad').val(); 

     $.post(url, 
     { 
      paquete:paquete, 
      material:material, 
      cantidad:cantidad 
     }) 
     .done(function(data) { 
      if(data['status'] == 'ko'){ 
       Materialize.toast('Cantidad es más grande que el material restante.', 4000) 
      }else{ 
       $('#forma_material_paquete').html(data); 
       $('select').material_select(); 
       Materialize.toast('El material ha sido agregado.', 4000) 
      } 
     }); 

     return false; 
}; 

Du wird das Formular mit AJAX, vorbei an die Daten an eine Ansicht von django und Hinzufügen des Elements oder Wenn Sie eine Änderung an Ihren Ansichten vornehmen, können Sie eine Benachrichtigung ausgeben, wenn der Anforderungsstatus in Ordnung war. Beispiel der Ansicht:

def agrega_material_paquete(request): 
if request.method == 'POST': 
    #Procesar datos 
    id_paquete = int(request.POST.get('paquete')) //Here you receive the data of the AJAX request. 
    paquete = get_object_or_404(Paquete, id=id_paquete) 
    id_material = int(request.POST.get('material')) 
    material = get_object_or_404(Material, id=id_material) 
    cantidad_material = int(material.cantidad) 
    cantidad = int(request.POST.get('cantidad')) 

    if cantidad_material >= cantidad: 
     Material_por_paquete.objects.create(paquete=paquete,material=material,cantidad=cantidad) 
     #Mostrar vista de nuevo 
     form = FormaMateriales() 
     materiales = Material.objects.filter(activo=True) 
     id_paquete = request.POST.get('paquete') 
     materiales_paquete = Material_por_paquete.materiales_paquete(id_paquete) 
     html = render_to_string('paquetes/select_materiales.html', {'form': form,'materiales':materiales,'materiales_paquete':materiales_paquete,'paquete':paquete}) 
     return HttpResponse(html) 
    else: 
     return JsonResponse({'status':'ko'}) 
else: 
    return JsonResponse({'status':'ko'}) 
+0

Hola Marco, nicht genau das, was ich suchte, aber es führte mich zu einer akzeptablen Lösung für mein Problem, und so muchas gracias! –

Verwandte Themen