Цикл Python For не работает

У меня проблемы с циклом for в моем приложении django. Я пытаюсь показать другим пользователям, которые вошли в систему в разделе «Пользователи, которые могут быть друзьями», но ничего не отображается. Я уверен, что мое приложение будет работать, как только я исправлю это. Я не уверен, что это мое мнение, но я не понимаю, что мне делать с этой проблемой.

template
<!DOCTYPE html>
<html>
    <head>
        <a href = "/logout">Logout</a>
        <form action = "/success" method = "GET">
            {% csrf_token %}
        <h1>Welcome! {{request.session.name}}</h1>
        <h2>Here is a list of your friends!</h2>
    </head>
    <body>
       <table>
        <thead>
           <th>Name</th>
           <th>Action</th>
        </thead>
        <tbody>
            <tr>
                {%for friends in friend%}
                <td><a href = "show/{{friends.id}}">View Profile</a></td>
                <td><a href = "remove/{{friends.id}}">Remove Friend</a></td>
                {%endfor%}
            </tr>
        </tbody>

       </table> 

    </body>
    <footer>
        <p>Other People who coudl be friends</p>
        <table>
            <thead>
                <th>Name</th>
                <th>Action</th>
            </thead>
            <tbody>
                <tr>
                    {%for friends in extra%}
                    <td><a href = "show/{{friends.id}}"></a></td>
                    <td><a href = "join/{{friends.id}}">Add a Friend</a></td>
                    {%endfor%}

                </tr>
            </form>
            </tbody>
        </table>
    </footer>

Взгляды:

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.shortcuts import render, redirect
from .models import User
from .models import Friend
from django.contrib import messages
import bcrypt

# Create your views here.
def index(request):            
            return render(request,'index.html')

def register(request):
    errors = User.objects.validate(request.POST)
    #print 'this process works', request.POST
    if len(errors) > 0:
        for error in errors:
            messages.error(request, error)
        return redirect("/")

    else:
        hashpwd = bcrypt.hashpw(request.POST["password"].encode(), bcrypt.gensalt())
        newuser = User.objects.create(
            first_name=request.POST['first_name'],
            last_name=request.POST['last_name'],
            email=request.POST['email'],
            password=hashpwd)

        request.session['user_id'] = newuser.id
        request.session['name'] = newuser.first_name
        print "session info", newuser.id, newuser.first_name
        return redirect("/success")

def login(request):
    errors = User.objects.loginvalidate(request.POST)
    if len(errors) > 0:
        for error in errors:
            messages.error(request, error)
        return redirect("/")
    else:
        user = User.objects.filter(email=request.POST['email'])[0]
        request.session['user_id'] = user.id
        request.session['name'] = user.first_name
        return redirect("/home")



def success(request):
    current_user = User.objects.get(id=request.session['user_id'])
    return render(request,"dashboard.html")

def home(request):
    user=User.objects.filter(id=request.session['user_id'])
    friends=Friend.objects.filter(key=request.session['user_id'])
    extra=Friend.objects.exclude(id=request.session['user_id'])
    context = {
    'user':user[0],
    'friend':friends,
    'extra':extra,
    }
    return render(request,"dashboard.html",context)

def logout(request):
    request.session.clear()
    #print 'goodbye'
    return redirect('/') 

def show(request,id):
    friends=Friend.objects.get(id=id)
    print 'show'
    context = {
        'show':friends
    }
    return render(request,"show.html",context)
def remove(request):
    users = User.objects.filter(id = request.session['user_id'])
    print "delete"
    return('/home')

def makefriend(request):
    print "friending"
    users = User.objects.get(id = request.session['user_id'])
    friend = Friend.objects.get(id=id)
    print "printing friends",friend
    friend.joined.add(users)
    friend.save()
    print "printing joined friend", Friend.joined
    return redirect ('/home')

Модели:

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import models
import bcrypt
import re
from datetime import *
import datetime

EMAIL_REGEX = re.compile(r'^[a-zA-Z0-9.+_-]+@[a-zA-Z0-9._-]+\.[a-zA-Z]+$')
NAME_REGEX = re.compile(r'^[aA-zZ\s]+$')

# Create your models here.



class UserManage(models.Manager):
    def validate(self, postData):
        errors = {}
        if len(postData['first_name']) < 2:
            errors["First name field can be left blank"] = "first_name"
        elif not NAME_REGEX.match(postData['first_name']):
            errors["This is not a valid first name. Try again."] = "first_name"

        if len(postData['last_name']) < 2:
            errors["Last name cannot be left blank"] = "last_name"

        elif not NAME_REGEX.match(postData['last_name']):
            errors["This is not a valid last name. Try again."] = "last_name"


        if len(postData['email']) < 1:
            errors["Email cannot be left blank"] = "email"

        elif not EMAIL_REGEX.match(postData['email']):
            errors["this is not a valid email try again"] = "email"

        if (User.objects.filter(email=postData['email'])):
            errors['Email already in use'] = "email"
        print postData["email"]


        if len(postData['password']) < 8:
            errors["Passwords must at least 8 characters"] = "password"

        if postData["password"] != postData["cpassword"]:
            errors["Passwords do not match"] = "cpassword"
        return errors

    def loginvalidate(self, postData):
        errors = {}
        if len(postData['email'])<1:
            errors["Email field can not be blank"] = "email"

        if len(postData["password"])<8:
            errors["Password must be at least 8 characters" ] = "password"

        if len(self.filter(email=postData['email']))>0:
            #print 'TRUE for emails'
            currentuser =self.filter(email=postData['email'])[0]
            existingpwd = currentuser.password

            if not bcrypt.checkpw(postData["password"].encode(), existingpwd.encode()):
                    errors["Password does not match"] = "password"
        else:
            errors["Email does not match"] = "email" 
        return errors

class User(models.Model):
    first_name = models.CharField(max_length=45)
    last_name = models.CharField(max_length=45)
    email = models.CharField(max_length=45)
    password = models.CharField(max_length=45)
    birthdate = models.DateField(auto_now=True)
    objects = UserManage()
class Friend(models.Model):
    key=  models.ForeignKey(User,related_name = "name")
    joined=models.ManyToManyField(User,related_name = "social")
    objects= UserManage()

Есть ли способ сократить это до минимальный воспроизводимый пример?

wwii 30.03.2018 04:36
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
75
1

Ответы 1

Отправляемый вами объект контекста сформирован неправильно. Ключом dict должно быть имя, которое вы используете в шаблоне для перебора значений.

Попробуйте изменить представление с помощью этой обновленной функции:

def show(request, id):
    friends = Friend.objects.get(id=id)
    print 'show'
    context = {
        'friends': friends
    }
    return render(request, "show.html", context)

Затем в вашем шаблоне измените цикл for: вы не соответствовали friends (множественное число) с friend (единственное число).

            {% for friend in friends %}
                <td><a href = "show/{{friend.id}}">View Profile</a></td>
                <td><a href = "remove/{{friend.id}}">Remove Friend</a></td>
            {% endfor %}

Кстати, если при запросе вашей базы данных с помощью id=id (как вы, по-видимому, здесь) вы получаете несколько объектов, у вас, вероятно, проблема больше, чем вы думаете;)

В заключение я имею в виду, что id всегда должен быть уникальным для данной таблицы, поэтому ваша переменная friends всегда должна содержать один (и только один) элемент. Если вам нужны все элементы, вы можете написать friends = Friend.objects.all(), и тогда у вас будет список всех ваших экземпляров friend в таблице Friend. Но это уже другая тема ;-)

edouardtheron 30.03.2018 04:41

Другие вопросы по теме