2017-11-13 5 views
0

これは自分自身(私の会社)にDjangoを採用すべきであることを証明する初めてのDjangoアプリですが、これまでのところ難しいことが分かりました。複数のManyToManyFieldフォームを持つDjango

私は、会社のすべての従業員とそれぞれの従業員の多くのスキルをカテゴリ別に整理したアプリを作成しようとしています。 は、ここに私のモデルです:

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) 

私は、スキルやEmployeeSkill従業員を作成することができるよ、とさえ与えられた従業員のすべての従業員のスキルを示したが、私は苦労してるところ私が行くべきかであります従業員のすべての可能なEmployeeSkillsを表示し、その従業員が各EmployeeSkillに関連付けられたレベル(およびdesired_level)を変更できるようにするフォームを作成します。

助けてください!

答えて

1

ManyToManyFIeldでオプションのselectを生成し、AJAXを使用して値を選択して追加するには、各オプションをレンダリングできます。


<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> 

そして、AJAXリクエスト:

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; 
}; 

あなたはつもりジャンゴのビューにデータを渡すと、要素を追加し、AJAXを使用してフォームを送信していますか、あなたのビューを変更すると、要求ステータスがOKだった場合に通知をポップできます。表示の例:

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、私が探していたものではありませんが、私の問題の許容可能な解決策につながりました。 –

関連する問題