0

I am working on a social media website for a capstone project, and am needing to get my user messages displayed. I see the messages created and added to my messages table in my db, but I cant seem to get the HTML to display them.

Ive been at this for about 6 hours. I have tried changing my naming conventions, checking my variables, forms, models, and server routes .

HTML:

{% block body %}

<h1>My Messages:</h1>
<ul>
{% for message in messages %}
    <li>
        <a href="/messages/{{ message.message }}">{{ message.sender }} {{ message.message }}</a>
    </li>
{% endfor %}
</ul>
{% endblock %}

ROUTE:

@app.route('/messages', methods=['GET', 'POST'])
@login_required
def messages():
    message_form = MessageForm()
    message_form.recipient.choices = [(user.id, user.username) for user in User.query.all()]
    
    if message_form.validate_on_submit():
        sender_id = current_user.id
        recipient_id = int(message_form.recipient.data)
        message = message_form.message.data  
        new_message = Message(sender_id=sender_id, recipient_id=recipient_id, message=message)
        db.session.add(new_message)
        db.session.commit()
        flash('Message sent!')
        return render_template('messages.html', message_form=message_form, message=message)

MODEL:

class Message(db.Model):
   __tablename__ = "messages"
    
    message_id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    sender_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False)
    recipient_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False)
    date_time = db.Column(db.DateTime, default=datetime.utcnow)
    message = db.Column(db.String, nullable=False)
    
    sender = db.relationship('User', foreign_keys=[sender_id])
    recipient = db.relationship('User', foreign_keys=[recipient_id])
    
    def get_time(self):
        return self.timestamp.strftime("%b %d, %Y %H:%M:%S")
    
    def __repr__(self):
        return f"<Message={self.message}>"

FORM:

class MessageForm(FlaskForm):
    sender_id = HiddenField('Sender')
    recipient = SelectField('Recipient', validators=[DataRequired()])
    message = TextAreaField('Message', validators=[DataRequired()])
    submit = SubmitField('Submit')
Damien779
  • 1
  • 1
  • Is `messages` being passed to `render_template`? Sorry I use more Django than Flask. – Memristor May 03 '23 at 00:59
  • yes, it is. I updated the redirect statement to a render template under the validate method to be sure, but still no joy. I appreciate it, either way. – Damien779 May 03 '23 at 01:06
  • You have not passed messages to your template as context. If "conversation" is your "messages" context then, you need to use conversation in your for loop as {% for message in conversation %}. – Sanjay Shahi May 03 '23 at 01:25
  • I changed it and still nothing... – Damien779 May 03 '23 at 01:38
  • and honestly, at this point, i have just been trying to pull messages and display them by message sender, not by conversation. I haven't written any routes or anything for my conversation table. I am just trying to pull information directly from the messages table in my db. – Damien779 May 03 '23 at 01:52

1 Answers1

0

I got it fixed. I was calling the endpoint for messages rather than the function in my HTML. The updated HTML does not have the forward slash before 'messages' in the url_for method:

{% block body %}
<h1>My Messages:</h1>
<ul>
{% for message in messages %}
    <li>
        <div method="GET", action="{{ url_for ('messages') }}">
            <p>From: {{ message.sender.username }}</p>
            <p>Message: {{ message.message }}</p>
            <p>Date/Time: {{ message.date_time }}</p>
        </div>
    </li>
{% endfor %}
</ul>
{% endblock %}

working messages:

Damien779
  • 1
  • 1