【问题标题】:Change model form field to text input widget将模型表单字段更改为文本输入小部件
【发布时间】:2019-02-05 09:31:53
【问题描述】:

我想将“trans_recipient”字段小部件从下拉列表更改为文本输入字段。在大的情况下

我尝试了以下方法:

class SafeTransactionForm(forms.ModelForm):
''' SafeTranSactionForm '''
trans_recipient = forms.CharField(widget=forms.TextInput(attrs={'class': 'special'}))
class Meta:
    model = SafeTransaction
    fields = [ 'trans_recipient',
                'subject',
                'arbitrator_name',
                'payment_condition',
                'amount_to_pay']

产生这个:

虽然小部件本身发生了变化,但实际上尝试使用它会产生一个值错误:

没有我错误的单行尝试更改小部件:

class SafeTransactionForm(forms.ModelForm):
''' SafeTranSactionForm '''
class Meta:
    model = SafeTransaction
    fields = [ 'trans_recipient',
                'subject',
                'arbitrator_name',
                'payment_condition',
                'amount_to_pay']

下拉菜单:

我尝试过使用语法,尝试更新元类中的小部件,但我大多以语法错误告终,并且在一些 Google 搜索之后我无法找到这种特定情况的示例。

非常欢迎和赞赏洞察力和解释。

编辑:

现在我收到一个错误:ValueError: invalid literal for int() with base 10: 'inbox'

堆栈跟踪:

UpdateView 类:

class SafeTransUpdateView(UpdateView):
'''
    This view lets the user Update a SafeTransaction receipt
    then send an automatic email to the email address
'''
form_class = SafeTransactionForm
model = SafeTransaction
template_name = "myInbox/safeTrans_update.html"

def __init__(self, *args, **kwargs):
    self.request = kwargs.pop('request', None)
    super(SafeTransUpdateView, self).__init__(*args, **kwargs)

def form_valid(self, form):
    trans = form.save(commit=False)
    trans.save()
   ### Send an email to the user upon transaction update.
    usr_obj = User.objects.get(customuser=trans.trans_recipient)
    user_mail = usr_obj.email
    from_email = 'timi.ogunkeye@gmail.com'
    contents = "This transaction [ " +trans.payment_condition+" ] has been updated !"
    email_subject = 'Transaction Update !'
    try:
        send_mail(email_subject, contents, from_email, [user_mail], fail_silently=False)
        pass
    except:
        pass
    else:
        pass
    return HttpResponseRedirect('inbox')

我的更新表格:

class SafeTransactionForm(forms.ModelForm):
''' SafeTranSactionForm '''
# trans_recipient = forms.CharField(widget=forms.TextInput(attrs={'class':'special'}))
trans_recipient = forms.ModelChoiceField(queryset=CustomUser.objects.all(),
widget=forms.TextInput(attrs={'value':"username"}), to_field_name="username")

def clean_trans_recipient(self):
    data = self.cleaned_data['trans_recipient']
    try:
        return CustomUser.objects.get(username=data)
    except CustomUser.DoesNotExist:
        raise forms.ValidationError("No user with this username exists")

class Meta:
    model = SafeTransaction
    fields = [  'trans_recipient',
                'trans_recipient_email',
                'subject',
                'arbitrator_name',
                'payment_condition',
                'amount_to_pay']

safeTrans_update.html:

        <h1>TRANSACTION UPDATE: </h1>
        <form action="{% url 'ST_update' object.pk %}" method="post">{% csrf_token %}
            {{ form.as_p }}
            <input type="submit" value="Confirm Update" />   
        </form>

urls.py:

 path('ST_update/<pk>',SafeTransUpdateView.as_view(),name='ST_update'),

我想知道为什么现在会出现这个错误:ValueError: invalid literal for int() with base 10: 'inbox' 。非常感谢任何信息。

【问题讨论】:

标签: python django django-forms django-widget


【解决方案1】:

问题在于 Django 不知道如何将表单字段中的数据转换回模型的trans_recipient 属性(应该是CustomUser 实例)。

但这没有问题:您可以执行表单清理,然后编写一个自定义函数将字符串转换回CustomUser 对象,例如:

class SafeTransactionForm(forms.ModelForm):
    ''' SafeTranSactionForm '''
    trans_recipient = forms.CharField(widget=forms.TextInput(attrs={'class': 'special'}))

    def clean_trans_recipient(self):
        data = self.cleaned_data['recipients']
        try:
            return CustomUser.objects.get(username=data)
        except CustomerUser.DoesNotExist:
            raise forms.ValidationError("No user with this username exists")

    class Meta:
        model = SafeTransaction
        fields = [ 'trans_recipient', 'subject', 'arbitrator_name',
                   'payment_condition', 'amount_to_pay' ]

尽管您可能需要对CustomUser fetch 进行一些调整。因此,我们的目标是获取这样的CustomUser 并返回它。如果不存在这样的CustomUser,那么我们提出ValidationError

【讨论】:

  • 我很确定这与此表单无关。我建议你用相关的模型、表单、视图等和 full 回溯提出一个新问题。只是错误消息并没有说太多,因为该错误可能来自任何地方。
  • @timi95:通常这是在您过滤查询集或创建对象时生成的错误,其中您传递了ForeignKey 的字符串。所以像Group.objects.filter(user='foo') 这样的东西没有意义,因为user 应该是User,而'foo' 是字符串,而不是用户。
  • 但是username 不是CharField 吗?
  • @timi95: 不,这里的username 到底是什么,这是关键。如果是ForeignKey,我们需要用JOIN查询。
  • 好吧,pk 只能有一个int,因此您可以通过编写path('ST_update/&lt;int:pk&gt;', ...) 来“限制”路径,然后查看生成无效 URL 的确切位置。 int: 部分将确保从现在开始,此视图将仅使用形状为 [0-9]+pk 触发。
猜你喜欢
  • 2017-02-13
  • 2021-10-14
  • 1970-01-01
  • 2012-04-20
  • 2015-09-21
  • 1970-01-01
  • 1970-01-01
  • 2016-05-24
  • 1970-01-01
相关资源
最近更新 更多