Can somebody help me on how to handle this scenario?

42 views
Skip to first unread message

Nirmal Sharma

unread,
Aug 21, 2012, 8:57:05 PM8/21/12
to django...@googlegroups.com, padmapriy...@gmail.com

--This is the model definition

FEEDBACK_CHOICES = (
        (1, 'FOR'),
        (-1, 'AGAINST'),
        (0, 'NEUTRAL'),
    )


class user (models.Model):
    user_name  = models.CharField(max_length=150)
    

class comments (models.Model):
    comment  = models.CharField(max_length=1000)   
    root_comment =  models.ForeignKey('self', null=True, blank=True, related_name="children")
    user_id = models.ForeignKey(user)


class comment_feedback (models.Model):
    feedback_user_id = models.ForeignKey(user)
    comment_id =   models.ForeignKey(comments)
    feedback_type_id =  models.CharField(max_length=20, choices=FEEDBACK_CHOICES)
    class Meta:
        unique_together = [("feedback_user_id", "info_id")]



We are trying build a html page that will do the following.
Once a user logs in, he can write a new comment (that would result in an insert into comments table)
Alternatively he can do one of the following:
    select a comment of some other user and give his feedback (that would result in an insert into comment_feedback table)
    select a comment and write his own comment with a feedback on the original comment (that would result in an insert into comments table with root_comment as the original comment and an insert into comment_feedback table for the original comment)
    
We tried doing this inlineformset_factory and nested formsets. However we are quite confused on how to proceed with this. Also the comment_feedback table has 2 foreign keys.
How do we handle this at the form and template level? 

Regards
~Nirmal

Kurtis Mullins

unread,
Aug 21, 2012, 9:03:50 PM8/21/12
to django...@googlegroups.com
I'd offer to help but I think there may be quite a bit more you should understand about Django, before-hand. Have you gone through the Tutorial, yet? Also, just as a general style guideline to follow; class names are typically Pascal Case (http://c2.com/cgi/wiki?PascalCase) and the User class may be a bad name to use as the system already provides a User class which would be better extended by user name.

Sorry that my information isn't more helpful, but you're asking for help with quite a complex (but somewhat obvious) task and I'm not sure how much of the underlying technology you fully understand at this point. Not trying to frown down upon you for asking by any means! I just think it might be more beneficial if you've got a solid understanding of the basics first.

Maybe if there's a very specific question, I'd be more happy to help.

Good luck!

--
You received this message because you are subscribed to the Google Groups "Django users" group.
To view this discussion on the web visit https://groups.google.com/d/msg/django-users/-/oVRPCd9uzpgJ.
To post to this group, send email to django...@googlegroups.com.
To unsubscribe from this group, send email to django-users...@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/django-users?hl=en.

Kurtis Mullins

unread,
Aug 21, 2012, 9:05:58 PM8/21/12
to django...@googlegroups.com
Sorry, I meant to say the "User class which would be better extended using a User Profile". Documentation: https://docs.djangoproject.com/en/dev/topics/auth/#storing-additional-information-about-users

Nirmal Sharma

unread,
Aug 22, 2012, 5:13:29 AM8/22/12
to django...@googlegroups.com, padmapriy...@gmail.com
Hi,

I read all the tutorials and i know the Django basics as well.
I think you misunderstood what i asked.

Dont get confused with the 'user' class i mentioned below with   "User class which would be better extended using a User Profile" .
Just to give an example i used the name 'user'.
Let me rephrase the question.

class People (models.Model):
    person_name  = models.CharField(max_length=150)
    

class comments (models.Model):
    comment  = models.CharField(max_length=1000)   
    root_comment =  models.ForeignKey('self', null=True, blank=True, related_name="children")
    People_id = models.ForeignKey(People)


class comment_feedback (models.Model):
    feedback_People_id = models.ForeignKey(People)
    comment_id =   models.ForeignKey(comments)
    feedback_type_id =  models.CharField(max_length=20, choices=FEEDBACK_CHOICES)
    class Meta:
        unique_together = [("feedback_People_id", "info_id")]
   
We are trying build a html page that will do the following.
Once a user logs in, he can write a new comment (that would result in an insert into comments table)
Alternatively he can do one of the following:
    select a comment of some other peoples and give his feedback (that would result in an insert into comment_feedback table)
    select a comment and write his own comment with a feedback on the original comment (that would result in an insert into comments table with root_comment as the original comment and an insert into comment_feedback table for the original comment)
    
We tried doing this inlineformset_factory and nested formsets. However we are quite confused on how to proceed with this. Also the comment_feedback table has 2 foreign keys.
How do we handle this at the form and template level? 

Regards
~Nirmal

Paul Backhouse

unread,
Aug 22, 2012, 9:53:09 AM8/22/12
to django...@googlegroups.com
You shouldn't need to define "People" or "User", that already comes in
django.contrib.auth.models. Just import User and make that your foreign
key where needed.

A smart way would be to use django.contrib.comments.

https://docs.djangoproject.com/en/dev/ref/contrib/comments/

For more complex commenting mechanisms take a look at django packages:

http://www.djangopackages.com/grids/g/commenting/


Melvyn Sopacua

unread,
Aug 22, 2012, 11:57:47 PM8/22/12
to django...@googlegroups.com
Hi Nirmal,

I'll try to answer your question instead of assuming you're working with
django's auth system.

On 22-8-2012 7:13, Nirmal Sharma wrote:

> class People (models.Model):
> person_name = models.CharField(max_length=150)
>
>
> class comments (models.Model):
> comment = models.CharField(max_length=1000)
> root_comment = models.ForeignKey('self', null=True, blank=True,
> related_name="children")
> People_id = models.ForeignKey(People)
^^^^^^^^^^^^^^^
That's bad practice, because you're not designing a database, you're
designing a model that is built from things, not id's. So name this
field person or commentator or written_by:
written_by = models.ForeignKey(People)

Same applies on numerous fields below. The reason it's bad practice is
because when you request an attribute the name of the attribute should
describe what you get. When you request comments.people_id the
expectation is that you get an id, while in actuality you get a model
instance.

> class comment_feedback (models.Model):
> feedback_People_id = models.ForeignKey(People)
> comment_id = models.ForeignKey(comments)
> feedback_type_id = models.CharField(max_length=20,
> choices=FEEDBACK_CHOICES)
> class Meta:
> unique_together = [("feedback_People_id", "info_id")]
>
> We are trying build a html page that will do the following.
> Once a user logs in, he can write a new comment (that would result in an
> insert into comments table)
> Alternatively he can do one of the following:
> select a comment of some other peoples and give his feedback (that
> would result in an insert into comment_feedback table)
> select a comment and write his own comment with a feedback on the
> original comment (that would result in an insert into comments table with
> root_comment as the original comment and an insert into comment_feedback
> table for the original comment)

Here's how to dissect your problem description:
- The person can do three things ("actions") that he cannot do at the
same time: the obvious solution is to use three different forms in the
same HTML page or use popup windows for action 2 and 3.
- The second and third option are mostly a UI problem, because how does
the user select the comment she's providing feedback for. Unless you put
a form below each comment (which will make the page possibly incredibly
long), you need to do some JavaScript programming that shows the form
below the right comment and stores the comment being commented on in
some hidden variables in that form. This is where I would hire a UI
programmer.

> We tried doing this inlineformset_factory and nested formsets. However we
> are quite confused on how to proceed with this. Also the comment_feedback
> table has 2 foreign keys.
That isn't a problem as long as the foreign keys are to different
tables. inlineformset_factory will find the foreign key that goes from
parent_model to model in it's function signature. It uses
_get_foreign_key() in forms/models.py for that.

> How do we handle this at the form and template level?

Like I said, the selection process is mostly a UI nightmare. If you
solve that, creating the forms for it will be much easier to grasp.
--
Melvyn Sopacua

Nirmal Sharma

unread,
Aug 23, 2012, 4:45:23 PM8/23/12
to django...@googlegroups.com
Thanks everybody for your help.
I will try what you have suggested and will come back with some more questions.
Reply all
Reply to author
Forward
0 new messages