Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ERROR:
- AttributeError at /settings/programarank/new
- 'ProgramaRankNew' object has no attribute 'object'
- Request Method: POST
- Request URL: http://127.0.0.1:8000/settings/programarank/new
- Django Version: 2.2.9
- Exception Type: AttributeError
- Exception Value:
- 'ProgramaRankNew' object has no attribute 'object'
- Exception Location: E:\curso\python\MAE\lib\site-packages\django\views\generic\detail.py in get_context_data, line 94
- Python Executable: E:\curso\python\MAE\Scripts\python.exe
- Python Version: 3.8.1
- Python Path:
- ['E:\\curso\\python\\MAE',
- 'C:\\Program Files (x86)\\Python38-32\\python38.zip',
- 'C:\\Program Files (x86)\\Python38-32\\DLLs',
- 'C:\\Program Files (x86)\\Python38-32\\lib',
- 'C:\\Program Files (x86)\\Python38-32',
- 'E:\\curso\\python\\MAE',
- 'E:\\curso\\python\\MAE\\lib\\site-packages']
- Server time: Mié, 5 Feb 2020 09:14:26 -0600
- MODELS:
- class Rank(ClaseModelo):
- codigo = models.CharField(
- max_length=5,
- help_text='Rank Codigo',
- unique=True
- )
- descripcion = models.CharField(
- max_length=50,
- help_text='Descripcion del Rango',
- unique=True
- )
- color = RGBColorField(colors=['#FFFFFF','#FBB403','#FBF703','#0D6006','#0CC70C','#B005F5','#000291','#626163','#FF0110','#000000'],default='#FFFFFF')
- def __str__(self):
- return '{} - {}'.format(self.codigo, self.descripcion)
- def save(self):
- self.codigo= self.codigo.upper()
- self.descripcion=self.descripcion.upper()
- self.color = self.color.upper()
- super(Rank,self).save()
- class Meta:
- verbose_name_plural="Ranks"
- class ProgramaRank(models.Model):
- programa = models.ForeignKey(Programa, on_delete=models.CASCADE)
- rangoactual = models.ForeignKey(Rank, related_name="rangoactual", on_delete=models.CASCADE)
- rangonuevo = models.ForeignKey(Rank, related_name='rangonuevo', on_delete=models.CASCADE)
- class Programa(ClaseModelo):
- descripcion = models.CharField(
- max_length=50,
- help_text='Descripcion de Programa',
- unique=True
- )
- def __str__(self):
- return '{}'.format(self.descripcion)
- def save(self):
- self.descripcion = self.descripcion.upper()
- super(Programa, self).save()
- class Meta:
- verbose_name_plural="Programas"
- VIEWS:
- class ProgramaRankNew(SuccessMessageMixin, SinPrivilegios, generic.CreateView):
- permission_required = "settings.add_programarank"
- model = Programa
- template_name = "settings/programarank_form.html"
- form_class = ProgramaRankEncForm
- success_url = reverse_lazy('settings:programarank_list')
- def get(self, request, *args, **kwargs):
- self.object = None
- form_class = self.get_form_class()
- form = self.get_form(form_class)
- detalle_programa = DetallesProgramaFormSet()
- return self.render_to_response(
- self.get_context_data(form = form, detalle_programa = detalle_programa)
- )
- def post(self, request, *args, **kwargs):
- form_class = self.get_form_class()
- form = self.get_form(form_class)
- detalle_programa = DetallesProgramaFormSet(self.request.POST)
- if form.is_valid() and detalle_programa.is_valid():
- return self.form_valid(form, detalle_programa)
- else:
- return self.form_invalid(form, detalle_programa)
- def form_valid(self, form, detalle_programa):
- self.object = form.save()
- detalle_programa.instance = self.object
- detalle_programa.save()
- return HttpResponseRedirect(self.success_url)
- def form_invalid(self, form, detalle_programa):
- return self.render_to_response(
- self.get_context_data(form = form, detalle_programa = detalle_programa)
- )
- FORMS
- class ProgramaRankEncForm(forms.ModelForm):
- descripcion = forms.ModelChoiceField(queryset=Programa.objects.filter(activo=True).order_by("descripcion"), empty_label="Seleccione el Programa")
- class Meta:
- model = Programa
- fields = ['descripcion']
- def __init__(self,*args, **kwargs):
- super().__init__(*args,**kwargs)
- for field in iter(self.fields):
- self.fields[field].widget.attrs.update({'class':'form-control'})
- class ProgramaRankDetForm(forms.ModelForm):
- rangoactual = forms.ModelChoiceField(queryset = Rank.objects.filter(activo=True).order_by("id"),empty_label="Seleccione Rango")
- rangonuevo = forms.ModelChoiceField(queryset = Rank.objects.filter(activo=True).order_by("id"),empty_label="Seleccione Rango")
- class Meta:
- model = ProgramaRank
- fields = ['rangoactual','rangonuevo']
- def __init__(self, *args, **kwargs):
- super().__init__(*args,**kwargs)
- for field in iter(self.fields):
- self.fields[field].widget.attrs.update({'class':'form-control'})
- DetallesProgramaFormSet = inlineformset_factory(Programa, ProgramaRank, form=ProgramaRankDetForm, extra=10)
- TEMPLATE:
- {% extends 'base/base.html' %}
- {% block content%}
- {% if form.errors %}
- {% for field in form %}
- {% if field.errors %}
- <div class="alert alert-danger fade in">
- <a href="#" class="close" data-dismiss="alert" aria-label="close">×</a>
- {% for error in field.errors %}
- <strong>{{ error|escape }}</strong>
- {% endfor %}
- </div>
- {% endif %}
- {% endfor %}
- {% if form.non_field_errors%}
- <div class="alert alert-danger">
- <a href="#" class="close" data-dismiss="alert" aria-label="close">×</a>
- {% for error in form.non_field_errors %}
- <strong>{{ error|escape }}</strong>
- {% endfor %}
- </div>
- {% endif %}
- {% endif %}
- {% if object %}
- <form method="POST" action="{% url 'settings:programarank_edit' object.pk %}" class="empty-form">
- {% else %}
- <form method="POST" action="{% url 'settings:programarank_new' %}">
- {% endif %}
- <div class="card mb-4 py-3 border-left-primary">
- <h2 class="m-2 font-weight-bold text-primary"> {% if object %} Editar {% else %} Nueva {% endif %} Estructura de Rangos</h2></h2>
- <div class="card-body">
- {% csrf_token %}
- <div class="col">
- <div class="form-group ">
- {{ form.descripcion }}
- <small class="text-danger">{{form.errors.descripcion}}</small>
- </div>
- </div>
- {{ detalle_factura.management_form }}
- <table width="100%" class="table table-bordered" id="dataTables-example" cellspacing="0">
- <thead>
- <td class="text-center">Rango Actual</td>
- <td class="text-center">Rango Nuevo</td>
- <td class="text-center">Borrar</td>
- </thead>
- <tbody>
- {% for detalle in detalle_programa %}
- <tr>
- <td>{{ detalle.rangoactual }}
- {% if detalle.rangoactual.errors %}
- {% for error in detalle.rangoactual.errors %}
- <small class="text-danger">{{ error|escape }} </small>
- {% endfor %}
- {% endif %}</td>
- <td> {{ detalle.rangonuevo }}
- {% if detalle.rangonuevo.errors %}
- {% for error in detalle.rangonuevo.errors %}
- <small class="text-danger">{{ error|escape }} </small>
- {% endfor %}
- {% endif %}
- </td>
- <td>{{ detalle.DELETE }}</td>
- </tr>
- {% endfor %}
- </tbody>
- </table>
- </div>
- <div class="text-center">
- <button type="submit" class="btn btn-success" name="submit"><span class="fa fa-save"></span> Guardar</button>
- <a class="btn btn-danger" href="{% url 'settings:programarank_list' %}"><span class="fa fa-undo"></span> Cancelar</a>
- </div>
- </div>
- </form>
- {% endblock content %}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement