I'm having a problem hope you could help me please.
I got these models:
MODELS = (
('A', 'A'),
('B', 'B'),
)
class person(models.Model):
nombre = models.CharField(max_length=128)
model = models.CharField(max_length=128,choices=MODELS, default=True)
def __str__(self):
return self.nombre
class person_A(models.Model):
person = models.ForeignKey(person, on_delete=models.PROTECT, null=True)
hobbies = models.CharField(max_length=40, default='')
def __str__(self):
return self.person.nombre
class person_B(models.Model):
person = models.ForeignKey(person, on_delete=models.PROTECT, null=True)
age = models.IntegerField(default=10)
def __str__(self):
return self.person.nombre
As you can see I have person_A
, person_B
which will be saved in my database.
Here's my view:
def get_person(request):
titulo = 'Person'
qs_a = person_A.objects.all()
qs_b = person_B.objects.all()
qs = chain(qs_b,qs_a)
form = person_aForm(request.POST or None)
form2 = personForm(request.POST or None)
form4 = person_bForm(request.POST or None)
context = {
"qs_a": qs_a,
"qs_b": qs_b,
"qs": qs,
"form2": form2,
"form": form,
"form4": form4,
"titulo": titulo,
}
form2_valid = form2.is_valid()
form_valid = form.is_valid()
form4_valid = form4.is_valid()
if form2_valid:
person = form2.save()
if form_valid:
person_a = form.save(commit=False)
person_a.person = person
person_a.save()
messages.success(request, 'Se ha guardado satisfactoriamente')
return redirect("get_person")
if form4_valid:
person_b = form4.save(commit=False)
person_b.person = person
person_b.save()
messages.success(request, 'Se ha guardado satisfactoriamente')
return redirect("get_person")
return render(request, "person.html", context)
Here as you can see is being saved my form for person_A
or person_B
.
Here's my delete function:
def delete_person(request,id):
try:
qs = person_B.objects.all()
instance = get_object_or_404(qs, id=id)
instance.delete()
messages.success(request, 'B')
except:
try:
qs = person_A.objects.all()
instance = get_object_or_404(qs, id=id)
instance.delete()
messages.success(request, 'A')
except:
pass
return redirect('get_person')
My url:
url(r'^delete_person/(?P<id>\d+)/$',views.delete_person, name='delete_person'),
Template:
<table class="table table-hover">
<thead>
<tr>
<th>ID</th>
<th>Name</th>
<th>Last Name</th>
<th>Delete</th>
</tr>
</thead>
<tbody>
{% for item in qs %}
<tr>
<td>{{ item.id }}</td>
<td>{{ item.person.model }}</td>
<td>{{ item.person.nombre }}</td>
<td><a href="{% url 'delete_person' item.id %}">Delete</a></td>
</tr>
{% endfor %}
</tbody>
</table>
Basically, I'm having two different models which everyone is being saved in the database and being shown in a table
. To do that I used chain()
from itertools
. I joined Person A and Person B to show them both in one table
. This is working fine, now here's my problem:
If person_A
has the same id
as person_B
and I want to delete person_A
, it will delete person_B
instead. I know this is because of the chain()
but i'd like to know if there's a possible way to solve this?
Thank you!