Necesitas una tabla que relacione a estudiantes
y proyecto
, llamemos a esta tabla "autores
" esta tabla contendra los autores de un proyecto.
su estructura podria ser:
id | student_id | proyecto_id
tu models.py
podría ser:
class autores(models.Model):
student_id = models.ForeignKey(estudiantes)
proyecto_id = models.ForeignKey(proyecto)
digamos que tienes 3 vistas:
view_proyecto
=> aca se visualiza el proyecto y sus autores
borrar_autor
=> vista encargada de eliminar un autor
agregar_autor
=> vista encargada de agregar autor y verificar si hay 2 como limite
tu views.py podría contener:
from home.models import proyecto, autores, estudiantes
from django.shortcuts import redirect
from django.contrib.auth.models import User
def view_proyecto(request, proyecto_id):
students = autores.objects.filter(proyecto_id=proyecto_id)
data = {
'students' : students,
'count_authors' : int(students.count()),
'proyecto_id' : proyecto_id
}
return render(request, 'proyect.html', data)
def borrar_autor(request, key_id, proyecto_id):
autores.objects.filter(id=key_id).delete()
return redirect('view_proyecto', proyecto_id)
def agregar_autor(request):
if request.method != 'POST' or not request.POST:
return HttpResponse('bad request') #HttpResponseBadRequest()
if 'proyecto' not in request.POST:
return HttpResponse('no se pudo obtener el id del proyecto')
proyecto_id = request.POST['proyecto']
proyect = proyecto.objects.filter(id=proyecto_id)
proyect_exists = (False, True)[proyect.count() > 0]
if not proyect_exists:
return HttpResponse('ese proyecto no existe')
if 'student' not in request.POST or request.POST['student'].strip() == '':
return HttpResponse('no ingresaste el usuario')
student_id = int((0, request.POST['student'])[request.POST['student'].isdigit()])
if student_id is None or not student_id > 0:
return HttpResponse('debes ingresar un id valido')
student = estudiantes.objects.filter(id=student_id)
student_exists = (False, True)[student.count() > 0]
if not student_exists:
return HttpResponse('ese estudiante no existe')
count_authors = autores.objects.filter(proyecto_id=proyecto_id).count()
if count_authors > 1:
return HttpResponse('el limite de estudiantes es 2')
author_exists = (autores.objects.filter(student_id = student_id).count() > 0)
if author_exists:
return HttpResponse('ese autor ya existe en este proyecto')
author = autores.objects.create(student_id = student.get(), proyecto_id = proyect.get())
author.save()
return redirect('view_proyecto', proyecto_id)
tu plantilla podria ser:
<div>existen {{ count_authors }} autores en este proyecto</div><br>
{% if count_authors < 2 %}
<strong>agregar otro estudiante a este proyecto:</strong><br><br>
<form method="POST" action="/agregar-autor/">
<label>id del estudiante:</label><br>
<input type="text" name="student"><br>
<input type="hidden" name="proyecto" value="{{proyecto_id}}">
{% csrf_token %}
<input type="submit" value="Agregar">
</form>
{% endif %}
{% if count_authors > 0 %}
Eliminar estudiantes en este proyecto:<br>
{% for student in students %}
<div>estudiante con id {{student.id}} [<a href="/borrar-autor/{{student.id}}/{{student.proyecto_id.id}}">X</a>]</div>
{% endfor %}
{% endif %}
y tu urls.py
podria contener:
url(r'^proyecto/([0-9]+)', view='home.views.view_proyecto', name='view_proyecto'),
url(r'^agregar-autor/', view='home.views.agregar_autor'),
url(r'^borrar-autor/([0-9]+)/([0-9]+)', view='home.views.borrar_autor'),
Nota: fijate que yo supuse que tienes una tabla estudiantes
, solo supongo por que no tengo ni idea de como es la estructura de tu modelo. Tambien reviza en urls.py que las rutas estan con una app llamada home, la cual deberias reemplazar por tu app correspondiente.
class estudiantes(models.Model):
user = models.ForeignKey(User)
url(r'^borrar-autor/([0-9]+)/([0-9]+)', view='home
.views.borrar_autor'),