Advertisement
dregueiro

inlineformset_factory

Feb 1st, 2020
207
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.21 KB | None | 0 0
  1. ERROR:
  2. AttributeError at /settings/programarank/new
  3. 'ProgramaRankNew' object has no attribute 'object'
  4. Request Method: POST
  5. Request URL: http://127.0.0.1:8000/settings/programarank/new
  6. Django Version: 2.2.9
  7. Exception Type: AttributeError
  8. Exception Value:
  9. 'ProgramaRankNew' object has no attribute 'object'
  10. Exception Location: E:\curso\python\MAE\lib\site-packages\django\views\generic\detail.py in get_context_data, line 94
  11. Python Executable: E:\curso\python\MAE\Scripts\python.exe
  12. Python Version: 3.8.1
  13. Python Path:
  14. ['E:\\curso\\python\\MAE',
  15. 'C:\\Program Files (x86)\\Python38-32\\python38.zip',
  16. 'C:\\Program Files (x86)\\Python38-32\\DLLs',
  17. 'C:\\Program Files (x86)\\Python38-32\\lib',
  18. 'C:\\Program Files (x86)\\Python38-32',
  19. 'E:\\curso\\python\\MAE',
  20. 'E:\\curso\\python\\MAE\\lib\\site-packages']
  21. Server time: Mié, 5 Feb 2020 09:14:26 -0600
  22.  
  23. MODELS:
  24. class Rank(ClaseModelo):
  25. codigo = models.CharField(
  26. max_length=5,
  27. help_text='Rank Codigo',
  28. unique=True
  29. )
  30. descripcion = models.CharField(
  31. max_length=50,
  32. help_text='Descripcion del Rango',
  33. unique=True
  34. )
  35. color = RGBColorField(colors=['#FFFFFF','#FBB403','#FBF703','#0D6006','#0CC70C','#B005F5','#000291','#626163','#FF0110','#000000'],default='#FFFFFF')
  36.  
  37. def __str__(self):
  38. return '{} - {}'.format(self.codigo, self.descripcion)
  39.  
  40.  
  41. def save(self):
  42. self.codigo= self.codigo.upper()
  43. self.descripcion=self.descripcion.upper()
  44. self.color = self.color.upper()
  45. super(Rank,self).save()
  46.  
  47. class Meta:
  48. verbose_name_plural="Ranks"
  49.  
  50.  
  51. class ProgramaRank(models.Model):
  52. programa = models.ForeignKey(Programa, on_delete=models.CASCADE)
  53. rangoactual = models.ForeignKey(Rank, related_name="rangoactual", on_delete=models.CASCADE)
  54. rangonuevo = models.ForeignKey(Rank, related_name='rangonuevo', on_delete=models.CASCADE)
  55.  
  56. class Programa(ClaseModelo):
  57. descripcion = models.CharField(
  58. max_length=50,
  59. help_text='Descripcion de Programa',
  60. unique=True
  61. )
  62.  
  63. def __str__(self):
  64. return '{}'.format(self.descripcion)
  65.  
  66. def save(self):
  67. self.descripcion = self.descripcion.upper()
  68. super(Programa, self).save()
  69.  
  70. class Meta:
  71. verbose_name_plural="Programas"
  72.  
  73.  
  74.  
  75. VIEWS:
  76. class ProgramaRankNew(SuccessMessageMixin, SinPrivilegios, generic.CreateView):
  77. permission_required = "settings.add_programarank"
  78. model = Programa
  79. template_name = "settings/programarank_form.html"
  80. form_class = ProgramaRankEncForm
  81. success_url = reverse_lazy('settings:programarank_list')
  82.  
  83. def get(self, request, *args, **kwargs):
  84. self.object = None
  85. form_class = self.get_form_class()
  86. form = self.get_form(form_class)
  87. detalle_programa = DetallesProgramaFormSet()
  88. return self.render_to_response(
  89. self.get_context_data(form = form, detalle_programa = detalle_programa)
  90. )
  91.  
  92. def post(self, request, *args, **kwargs):
  93. form_class = self.get_form_class()
  94. form = self.get_form(form_class)
  95. detalle_programa = DetallesProgramaFormSet(self.request.POST)
  96.  
  97. if form.is_valid() and detalle_programa.is_valid():
  98. return self.form_valid(form, detalle_programa)
  99. else:
  100. return self.form_invalid(form, detalle_programa)
  101.  
  102. def form_valid(self, form, detalle_programa):
  103. self.object = form.save()
  104. detalle_programa.instance = self.object
  105. detalle_programa.save()
  106. return HttpResponseRedirect(self.success_url)
  107.  
  108. def form_invalid(self, form, detalle_programa):
  109. return self.render_to_response(
  110. self.get_context_data(form = form, detalle_programa = detalle_programa)
  111. )
  112.  
  113.  
  114. FORMS
  115. class ProgramaRankEncForm(forms.ModelForm):
  116. descripcion = forms.ModelChoiceField(queryset=Programa.objects.filter(activo=True).order_by("descripcion"), empty_label="Seleccione el Programa")
  117.  
  118. class Meta:
  119. model = Programa
  120. fields = ['descripcion']
  121.  
  122. def __init__(self,*args, **kwargs):
  123. super().__init__(*args,**kwargs)
  124. for field in iter(self.fields):
  125. self.fields[field].widget.attrs.update({'class':'form-control'})
  126.  
  127.  
  128. class ProgramaRankDetForm(forms.ModelForm):
  129. rangoactual = forms.ModelChoiceField(queryset = Rank.objects.filter(activo=True).order_by("id"),empty_label="Seleccione Rango")
  130. rangonuevo = forms.ModelChoiceField(queryset = Rank.objects.filter(activo=True).order_by("id"),empty_label="Seleccione Rango")
  131.  
  132. class Meta:
  133. model = ProgramaRank
  134. fields = ['rangoactual','rangonuevo']
  135.  
  136. def __init__(self, *args, **kwargs):
  137. super().__init__(*args,**kwargs)
  138. for field in iter(self.fields):
  139. self.fields[field].widget.attrs.update({'class':'form-control'})
  140.  
  141.  
  142. DetallesProgramaFormSet = inlineformset_factory(Programa, ProgramaRank, form=ProgramaRankDetForm, extra=10)
  143.  
  144.  
  145.  
  146. TEMPLATE:
  147. {% extends 'base/base.html' %}
  148. {% block content%}
  149. {% if form.errors %}
  150. {% for field in form %}
  151. {% if field.errors %}
  152. <div class="alert alert-danger fade in">
  153. <a href="#" class="close" data-dismiss="alert" aria-label="close">&times;</a>
  154. {% for error in field.errors %}
  155. <strong>{{ error|escape }}</strong>
  156. {% endfor %}
  157. </div>
  158. {% endif %}
  159. {% endfor %}
  160. {% if form.non_field_errors%}
  161. <div class="alert alert-danger">
  162. <a href="#" class="close" data-dismiss="alert" aria-label="close">&times;</a>
  163. {% for error in form.non_field_errors %}
  164.  
  165. <strong>{{ error|escape }}</strong>
  166. {% endfor %}
  167. </div>
  168. {% endif %}
  169. {% endif %}
  170.  
  171. {% if object %}
  172. <form method="POST" action="{% url 'settings:programarank_edit' object.pk %}" class="empty-form">
  173. {% else %}
  174. <form method="POST" action="{% url 'settings:programarank_new' %}">
  175. {% endif %}
  176.  
  177. <div class="card mb-4 py-3 border-left-primary">
  178. <h2 class="m-2 font-weight-bold text-primary"> {% if object %} Editar {% else %} Nueva {% endif %} Estructura de Rangos</h2></h2>
  179. <div class="card-body">
  180. {% csrf_token %}
  181. <div class="col">
  182. <div class="form-group ">
  183. {{ form.descripcion }}
  184. <small class="text-danger">{{form.errors.descripcion}}</small>
  185. </div>
  186. </div>
  187. {{ detalle_factura.management_form }}
  188.  
  189. <table width="100%" class="table table-bordered" id="dataTables-example" cellspacing="0">
  190. <thead>
  191. <td class="text-center">Rango Actual</td>
  192. <td class="text-center">Rango Nuevo</td>
  193. <td class="text-center">Borrar</td>
  194. </thead>
  195. <tbody>
  196. {% for detalle in detalle_programa %}
  197. <tr>
  198. <td>{{ detalle.rangoactual }}
  199. {% if detalle.rangoactual.errors %}
  200. {% for error in detalle.rangoactual.errors %}
  201. <small class="text-danger">{{ error|escape }} </small>
  202. {% endfor %}
  203. {% endif %}</td>
  204. <td> {{ detalle.rangonuevo }}
  205. {% if detalle.rangonuevo.errors %}
  206. {% for error in detalle.rangonuevo.errors %}
  207. <small class="text-danger">{{ error|escape }} </small>
  208. {% endfor %}
  209. {% endif %}
  210. </td>
  211. <td>{{ detalle.DELETE }}</td>
  212. </tr>
  213. {% endfor %}
  214. </tbody>
  215. </table>
  216. </div>
  217.  
  218. <div class="text-center">
  219. <button type="submit" class="btn btn-success" name="submit"><span class="fa fa-save"></span> Guardar</button>
  220. <a class="btn btn-danger" href="{% url 'settings:programarank_list' %}"><span class="fa fa-undo"></span> Cancelar</a>
  221. </div>
  222.  
  223. </div>
  224.  
  225. </form>
  226. {% endblock content %}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement