如何在Django中使用一个视图/表单创建多个对象

时间:2020-04-21 18:14:57

标签: django django-models django-forms django-views

这就是我要尝试的操作,如果有更好的方法,请告诉我。 我正在创建一个约会应用程序,并试图创建一个消息表单,该消息表单将在用户与另一个用户匹配后显示。我已经有了匹配项,用户可以正确显示,但是我需要此消息传递组件。这将以与我的用户匹配的用户个人资料下方的链接的形式出现。现在,我的InstantMessage模型具有“对话”的外键,该外键应包含2个正在进行对话的成员,并且至少包含彼此之间交换的一条消息。现在,我想做的是,当用户单击链接以开始消息传递时,让我的代码检查两个用户之间是否已经存在对话对象,如果是,则将该对话对象pk用于我的对话字段在即时消息中,然后为此创建一个表单。如果没有,那么我希望先创建一个对话对象,然后再创建一个消息对象。我希望所有这些都在一个视图中并具有一个链接,因此我假设我需要使用if / else语句。无论如何,这是我的想法。但是,我不确定如何实现此功能,因为我对开发仍然是新手,甚至对django还是新手。我将如何实现这一目标?

models.py

class ProfileManager(BaseUserManager):



    def create_user(self, username, email,description,photo, password=None):
        if not email:
            raise ValueError("You must creat an email")
        if not username:
            raise ValueError("You must create a username!")
        if not description:
            raise ValueError("You must write a description")
        if not photo:
            raise ValueError("You must upload a photo")

        user = self.model(
                email=self.normalize_email(email),
                username = username, 
                description= description,
                photo= photo,

            )

        user.set_password(password)
        user.save(using=self._db)
        return user 


    def create_superuser(self, username, email,description,photo, password):
        user = self.create_user(
                email=self.normalize_email(email),
                password=password,
                username=username,
                description=description,
                photo=photo,

            )

        user.is_admin=True
        user.is_staff=True
        user.is_superuser=True
        user.save(using=self._db)
        return user




class Profile(AbstractBaseUser):

    class Meta:
        swappable = 'AUTH_USER_MODEL'


    email                       = models.EmailField(verbose_name="email")
    username                    = models.CharField(max_length=30, unique=True)
    date_joined                 = models.DateTimeField(verbose_name='date joined', auto_now_add=True)
    last_login                  = models.DateTimeField(verbose_name='last login', auto_now=True)
    is_admin                    = models.BooleanField(default=False)
    is_active                   = models.BooleanField(default=True)
    is_staff                    = models.BooleanField(default=False)
    is_superuser                = models.BooleanField(default=False)
    #what I added
    description                 = models.TextField()
    photo                       = models.ImageField(upload_to='profile_photo',blank=False, height_field=None, width_field=None, max_length=100)
    matches                     = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name='+', blank=True)



    USERNAME_FIELD = 'username'
    REQUIRED_FIELDS = ['description','photo','email']


    objects = ProfileManager()


    def __str__(self):
        return self.username


    def has_perm(self, perm, obj=None):
        return self.is_admin


    def has_module_perms(self,app_label):
        return True



class UserVote(models.Model):

    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    voter = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='given_vote', on_delete=models.CASCADE)
    vote = models.BooleanField(default=False)

    class Meta:
        unique_together = (('user', 'voter'))



class Conversation(models.Model):
    members = models.ManyToManyField(settings.AUTH_USER_MODEL)




class InstantMessage(models.Model):


    sender = models.ForeignKey(settings.AUTH_USER_MODEL, related_name= 'senderr',on_delete=models.CASCADE )
    receiver = models.ForeignKey(Conversation, on_delete=models.CASCADE)
    message = models.TextField()
    date = models.DateTimeField(auto_now_add=True)


    def __unicode__(self):
        return self.message

    #tests to see if messages are exclusive between sender, receiver (won't work with new model)
    @classmethod
    def find_messages_exclusive_to_profile(cls,sender,receiver):
        #members = receiver AND sender, not receiver or sender 
        exclusive_conversations = Conversation.objects.filter(members= receiver ).filter(members= sender)


        exclusive_messages = InstantMessage.objects.filter(receiver__in=exclusive_conversations)

        return exclusive_messages

views.py

def home(request):

    context = {'random_profiles': Profile.objects.exclude(id=request.user.id).order_by('?')[:3]}
    return render(request, 'dating_app/home.html',context)


def profiles(request):
    "Shows a list of profiles that have been created"
    profiles = Profile.objects.order_by('date_joined')
    context = {'profiles' : profiles}
    return render(request, 'dating_app/profiles.html',context)


def profile(request, profile_id):
    """show a single profile"""
    profile = get_object_or_404(Profile,id=profile_id)
    context = {'profile' : profile}
    return render(request, 'dating_app/profile.html', context)



# Below is related to users


def logout_view(request):
    """Log out the user """
    logout(request)
    return HttpResponseRedirect(reverse('dating_app:home'))


def register(request, profile_id):
    user =User.objects.get(pk=profile_id)
    user.profile.bio = 'fjfjfjjf'
    user.save()


def register(request):
    #Register a new user
    context = {}

    if request.POST:
        form = RegistrationForm(request.POST, request.FILES)
        if form.is_valid():
            form.save()
            username = form.cleaned_data.get('username')
            email = form.cleaned_data.get("email")
            description = form.cleaned_data.get("description")
            photo = form.cleaned_data.get("photo")
            raw_password = form.cleaned_data.get('password1')
            profile = authenticate(username=username,email=email,description=description, photo=photo, password=raw_password)
            login(request, profile)
            return redirect ('dating_app:home')
        else:
            context['registration_form'] = form
    else: #get request 
        form = RegistrationForm()
        context['registration_form'] = form
    return render(request, 'dating_app/register.html', context)



def update_account(request, profile_id):
    #Edit an existing profile 
    profile = get_object_or_404(Profile,id=profile_id)
    update_form = ProfileUpdateForm(request.POST, request.FILES)

    if request.method != 'POST':
        #Initial request; prefil form with current entry
        update_form = ProfileUpdateForm(instance=profile)
    else:
        #POST data submitted;process data. 
        update_form = ProfileUpdateForm(instance=profile, data=request.POST, files=request.FILES)
        if update_form.is_valid():
            update_form.save()
            return HttpResponseRedirect(reverse('dating_app:profile', args=[profile.id]))

    context = {'profile' : profile, 'update_form' : update_form}
    return render(request, 'dating_app/update.html', context)



#matching
def mingle(request):



    try:
        profile = (Profile.objects.exclude(id=request.user.id).exclude(uservote__voter=request.user).order_by('?')[0])
    except IndexError:
        profile = None
        print(Profile.username)
    try:

        description = request.user.description
    except Profile.DoesNotExist:
        create = Profile.objects.get_or_create(request.user)
        return redirect('profile')

    match = request.user.matches.all()
    context = dict(profile = profile, match = match)    
    return render(request, 'dating_app/mingle.html', context)



@login_required
def nice(request, profile_id):

    return create_vote(request, profile_id, True)

@login_required
def nope(request, profile_id):
    return create_vote(request, profile_id, False)





def create_vote(request, profile_id, vote):
    profile = get_object_or_404(Profile, pk=profile_id)


    UserVote.objects.create(
        user=profile,
        voter=request.user,
        vote=vote
    )
    other = UserVote.objects.filter(
        voter=profile,
        user=request.user,
        vote=True
    )
    if vote and other.exists():
        profile.matches.add(request.user)
        request.user.matches.add(profile)
    return redirect('dating_app:mingle')



def view_matches(request,profile_id):
    match = request.user.matches.all()
    profile = get_object_or_404(Profile,id=profile_id)

    context = {'match' : match, 'profile' : profile}

    return render(request, 'dating_app/matches.html', context)



#form
def instant_message(request, receiver_id):
    if request.method == 'POST':
        form = InstantMessageForm(request.POST)
        if form.is_valid():
            form.instance.sender = request.user
            form.instance.receiver = get_object_or_404(get_user_mode(), pk=receiver_id)
            form.save()
            return redirect('dating_app:home')
    else:
        form = InstantMessageForm()
    context = {'form':form}
    return render(request, 'dating_app/instant_message_form.html',context)



def messages(request, profile_id):


    other_user = get_object_or_404(Profile,id=profile_id)

    exclusive_conversations = Conversation.objects.filter(members= request.user ).filter(members= other_user)
    messages = InstantMessage.objects.filter(receiver__in=exclusive_conversations)

    context = {'messages' : messages, 'other_user' : other_user}

    return render(request, 'dating_app/messages.html', context)



def conversations(request,profile_id):




    conversations = Conversation.objects.filter(
        members=profile_id
    ).annotate(
        last_message=Max('instantmessage__date')
    ).prefetch_related('members').order_by(
        '-last_message'
    )



    return render(request, 'dating_app/conversations.html', {'conversations':conversations,})

0 个答案:

没有答案