entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

0voto

Guardar dos autores para un mismo proyecto en Django

Saludos queridos colegas de "entredesarrolladores.com".
Tengo una inquietud.... en Django, ¿cuál sería la forma de guardar 2 autores en un mismo proyecto?. La idea es esta:

  1. Tabla Estudiantes
  2. Tabla Proyecto
  3. Establecer a 1 ó 2 estudiantes (máximo) como autor de ese Proyecto.

Dudas:
Cómo queda el modelo?
Cómo hago la vista?
Cómo le paso los parámetros al template para que el usuario pueda decidir si guardar 1 ó 2 autores?

Para mi es un poco confuso, por favor alguien que me ayude. Gracias.

1 Respuesta

1voto

white Puntos75880

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'),

0voto

ibrames comentado

Excelente brother. Bueno mi proyecto está así:
models.py

class participantes(models.Model):
cedula      = models.IntegerField(max_length=8)
primernombre = models.CharField( verbose_name="Primer Nombre",max_length=100)
segundonombre = models.CharField(max_length=100, null=True)
primerapellido  = models.CharField(max_length=100)
segundoapellido = models.CharField(max_length=100, null=True)
telefono    = models.CharField(max_length=14, null=True)
direccion   = models.TextField(max_length=300, null=True)
status      = models.BooleanField(default=True)
correo      = models.CharField(max_length=100, null=True)

def __str__(self):  
    return  '%s %s - C.I.: %d'% (self.primernombre, self.primerapellido, self.cedula)
class Meta:
    unique_together = [("primernombre","cedula")]

class proyecto(models.Model):

titulo  = models.CharField(max_length=300)
financiamiento = models.BooleanField(default=False)
autor = models.ForeignKey(participantes)
metodo  = models.ForeignKey(metodos)
episteme    = models.ForeignKey(episteme)
universidad = models.ForeignKey(universidad)
linea = models.ForeignKey(lineas)
tutor = models.CharField(max_length=3, editable = False)

class Meta:
    unique_together = [("titulo", "metodo", "episteme", "universidad")]

def __str__(self):
    # return self.titulo
    return  '%d - %s'% (self.id, self.titulo)

class autores(models.Model):
    proyecto = models.ForeignKey(proyecto)
    autor = models.ForeignKey(participantes)

views.py

def add_proyecto_view(request,id_entidad):
info = int(id_entidad)
info2 = int(id_entidad)
variable = proyecto.objects.filter(tutor=id_entidad)

if request.method == "POST":
    formulario = addProyectoForm(request.POST, request.FILES)

    if formulario.is_valid():
        agregar = formulario.save(commit=False)
        agregar.tutor = info
        agregar.save()
        return HttpResponseRedirect('/listadoproy/page/1/%d/'%info2) 

else:
    formulario = addProyectoForm()

ctx = {'formulario':formulario, 'info': info}
return render_to_response('home/addproyecto.html', ctx, context_instance=RequestContext(request))

Voy a intentar implementar lo que acabas de postear, yo te escribo.

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta