Django:允许用户重新选择RSVP选项

时间:2019-01-13 18:40:22

标签: html

我一直在使用Django 2.0.6和python 3.5建立一个婚礼网站。 我在允许用户更改其RSVP选择时遇到问题。

到目前为止,保存用户的输入有效。但是,我希望html在用户最初选择某些东西之后显示“ cocktailchangeform”。 cocktailChangeform应该会覆盖用户先前的输入。当我在管理页面下查看“参加”时,有多个“是”和“否”条目。 任何帮助将不胜感激。

Image of Admin Page

models.py

class UserFullName(User):
    class Meta:
        proxy=True
        verbose_name= 'Guest RSVP'
        verbose_name_plural = 'Guests RSVPs'

        def __str__(self):
            return self.get_full_name()


class Guest(models.Model):
    user = models.ForeignKey(UserFullName, on_delete='cascade')
    cocktail = models.CharField(max_length=20,choices=choice,default='No Response')

views.py

class CocktailView(FormView):
template_name = 'home/rsvp.html'

    def post(self, request, pk=None):
        if request.method == 'POST':
            form = CocktailForm(request.POST)

            if form.is_valid():
                post = form.save(commit=False)
                post.user = request.user
                post.save()
                form = CocktailForm()
                return redirect('/home')
            else:
                form = CocktailForm()
                return redirect('/home')

            args = {'form':form}
            return render(request, self.template_name, args)


class UpdateCocktail(FormView):
    template_name = 'home/rsvp.html'

    def post(self, request):
        if request.method == 'POST':
            form = CocktailChangeForm(request.POST, instance=request.user)

            if form.is_valid():
                form.save()
                return redirect('/home')
            else:
                form = CocktailChangeForm(instance=request.user)
                return redirect('/home')

            args = {'form':form}
            return render(request, self.template_name, args)

forms.py

class CocktailForm(forms.ModelForm):
    cocktails = forms.MultipleChoiceField(
            widget=forms.CheckboxSelectMultiple,
            choices=choice,
            required=True,
            initial='No Response',
            error_messages={'Required':'Please Select One'},
    )

    class Meta:
        model = Guest
        fields = ('cocktail',)



class CocktailChangeForm(CocktailForm):

    class Meta:
        model = Guest
        fields = ('cocktail',)

        def __init__(self, *args, **kwargs):
            super(CocktailForm, self).__init__(*args, **kwargs)
            f = self.fields.get('cocktail', None)
            if f is not None:
                f.queryset = f.queryset.select_related('content_type')

rsvp.html

{% if user.is_authenticated %}
    <p>Will you be attending the Thursday evening Cocktail Party?</p><br>
    {% if cocktailform.cocktail is None %}
        <form action="/home/rsvp1/" method="post">
            {% csrf_token %}
            {{ cocktailform }}
            <button type="submit">Submit</button>
        </form>

    {% else %}
        <form action="/home/rsvp1/update/" method="post">
            {% csrf_token %}
            {{ cocktailchangeform }}
            <button type="submit">Update</button>
        </form>
    {% endif %}
    {% else %}
        <h3>You must be logged in to RSVP</h3>
{% endif %}

1 个答案:

答案 0 :(得分:0)

我知道了。刚刚删除了鸡尾酒更新表单和更新视图。我创建了一个视图,该视图确定用户是已创建要编辑的对象还是必须创建一个新的对象。

class CocktailView(FormView):
template_name = 'home/rsvp.html'

    def post(self, request):
        if request.method == 'POST':

            if len(Guest.objects.filter(user=request.user)) == 0:
                form = CocktailForm(request.POST)
                if form.is_valid():
                    post = form.save(commit=False)
                    post.user = request.user
                    post.save()
                    return redirect('/home')

            else:
                guest = Guest.objects.get(user=request.user)
                form = CocktailForm(data=request.POST, instance=guest)
                if form.is_valid():
                    post = form.save(commit=False)
                    post.save()
                    return redirect('/home')

        args = {'form':form}
        return render(request, self.template_name, args)